2

アタッチメント用のコントローラーには次のものがあります

  def upload

    @attachment = Attachment.build(:swf_uploaded_data => params[:attachment][:attachment], :user_id => current_user.id, :project_id => params[:space_id])
....
    end

私が CanCan に望むことは、ユーザーが所属する project_id にのみアップロードできるようにすることです。コントローラーが正しい情報を取得していることを確認しました。nil はありません

これが私のカンカンです:

can :upload, Attachment do |attachment|
  Rails.logger.info 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX- include CanCan::Ability - ATTACHMENT'  
  Rails.logger.info attachment.inspect
  Rails.logger.info attachment.project

  current_user.try(:role, attachment.space)
end

ここで問題は、その添付ファイルです。は nil で、attachment.project は nil ですか? CanCan でこの問題をどのように解決すれば、プロジェクト チーム メンバーだけが添付ファイルをプロジェクトにアップロードできるようになりますか?

ありがとうございました

4

2 に答える 2

5

authorize!コントローラーがアクションする方法で、より低いレベルでそれを行うのが最善のアプローチだと思います。

それで ...

#AttachmentController

#Will remove it from cancan
load_and_authorize_resource :except => [:upload]

def upload
 @attachment = Attachment.build(:swf_uploaded_data => params[:attachment][:attachment], :user_id => current_user.id, :project_id => params[:space_id])
  #add the authorize logic explicitly here when you have the attachment model populated
  authorize! :upload, @attachment
end

それがあなたのために働くかどうか私に知らせてください。

于 2010-12-03T21:24:24.153 に答える
0

たとえば、現在のループに対してのみイベントの作成を許可する場合は、次のようにします。

ビューで使用します

link.... if can? :create, @loop.events.new

そしてコントローラーで

skip_authorize_resource only: [:new, :create]

...

def new
   @event.loop_id = @loop.id
   authorize! :create, @event
end

#similar for create action
于 2012-07-09T13:03:35.647 に答える