私は次のモデルを持っています:
class Post < ActiveRecord::Base
has_many :responses, as: :responseable, dependent: :destroy
end
class Call < ActiveRecord::Base
has_many :responses, as: :responseable, dependent: :destroy
end
class Meeting < ActiveRecord::Base
has_many :responses, as: :responseable, dependent: :destroy
end
class Response < ActiveRecord::Base
belongs_to :responseable, polymorphic: true # Tested
end
CanCanでは、ポリモーフィックアソシエーションの属性を介して、特定のカスタムResponsesアクションの機能を定義しようとしています。アクションは次のようになります。
class ResponsesController < ApplicationController
before_filter :authenticate_user!
load_and_authorize_resource
respond_to :html, :xml, :js, :json, :pdf
# GET /responses/polling
# GET /responses/polling.json
def polling
responseable_type = params[:responseable_type]
klass = [Post, Call, Meeting].detect { |c| responseable_type}
@responseable = klass.find(params[:responseable_id])
@responses = @responseable.responses.where("created_at > ?", Time.at(params[:after]))
end
...
そして、私の能力ファイルは次のようになります。
...
can :polling, Response, :responseable_type = "Post", :responseable => { :user_expert_private => false, :countries => { :id => user.country_ids} }
...
このアクションは、5秒ごとに新しい応答をポーリングするjavascript関数を介して実行されます。ただし、これを実行すると、ログに次のエラーが表示されます。
A NameError occurred in responses#polling:
uninitialized constant Responseable
activesupport (3.2.8) lib/active_support/inflector/methods.rb:230:in `block in constantize'
ポリモーフィックな関係から属性の能力を定義する正しい方法はありますか?
can? show:
基本的に、親オブジェクトでない限り、ユーザーが応答を表示/作成できないようにする必要があります。