2

私は次のモデルを持っています:

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:基本的に、親オブジェクトでない限り、ユーザーが応答を表示/作成できないようにする必要があります。

4

1 に答える 1

1

wikiの記事を見てください。ポリモーフィック型に関するセクションがあります。ネストされた認証を使用する必要があります。関連するセクションは次のとおりです。

タスクは、ポリモーフィックな関連付けを介してプロジェクトまたはイベントに割り当てることができるとしましょう。配列は:throughオプションに渡すことができ、最初に見つかった配列を使用します。

load_resource :project
load_resource :event
load_and_authorize_resource :task, :through => [:project, :event]

ここでは、@ project変数と@event変数の両方をチェックし、存在する方を介してタスクをフェッチします。これは親モデルのみをロードしていることに注意してください。親を承認する場合は、特別なロジックが関係しているため、before_filterを介してロードする必要があります。

before_filter :authorize_parent
private
def authorize_parent
  authorize! :read, (@event || @project)
end
于 2013-01-09T21:05:41.183 に答える