Ruby on Railsにおける多型モデル資源ファインダ


Railsモデルで多型性の関連付けを行う場合、
  • URLを生成する
  • コントローラの親モデルを見つける
  • モデル構造の下を見てください.これらの質問にレールの方法に答えましょう.
    class Company < ActiveRecord::Base
      has_many :images
    end
    
    class Product < ActiveRecord::Base
      has_many :images
    end
    
    class Image < ActiveRecord::Base
      belongs_to :imageable, polymorphic: true
    end
    

    画像URLの生成
    Errorは、多型URLを生成する簡単な方法を提供します.polymorphic_path
    So polymorphic_path([parent, Image]) が生成されます.
    company_images_path(parent) # /companies/1/images
    
    # or
    
    product_images_path(parent) # /products/1/images
    

    コントローラの親モデルの検索
    イメージコントローラでは、関連するデータをスコープするために親情報が必要ですResourceFinder ヘルパー.
    class ImagesController < ApplicationController
      include ResourceFinder
    
      def index
        @resources = parentable.images
        render json: @resources
      end
    end
    
    そして、我々はapp/controllers/concerns/resource_finder.rb ヘルパー
    module ResourceFinder
      def parentable
        klass, param = parentable_class
        return unless klass
    
        klass.find(params[param.to_sym])
      end
    
      private
    
      def parentable_class
        params.each_key do |name|
          if name.match?(/(.+)_id$/)
            model = name[/([^\/.]*)_id$/, 1]
            return model.classify.safe_constantize, name
          end
          nil
        end
      end
    end
    
    The parentable_class paramを読んで、paramに関連付けられたクラスを定義します.我々の場合には、我々があるならば/products/:product_id/images このメソッドはproduct_id params keyとこのモデルからクラスを作成しようとします.成功すると、キーとクラスを返します.
    ハッピーハッキング!