让Cancan的load_and_authorize_resource在自定义创建操作中工作

时间:2011-08-10 17:42:11

标签: ruby-on-rails ruby-on-rails-3 cancan

尝试在我的应用中设置 Cancan ,但我的PostsController出现问题。

简而言之,当创建Post时,我希望它与current_user相关联,因此我的创建操作看起来像这样:

class PostsController < ApplicationController
  before_filter :login_required, :except => [:index, :show]
  load_and_authorize_resource
  ...
  def create
    # @post = Post.new(params[:post])   # <-- covered by load_and_authorize_resource
    @user = current_user
    @post = @user.posts.create(params[:post])
    respond_to do |format|
    ...
  end
  ...
end

我不确定load_and_authorize_resource打算做什么(除了显而易见的事)。但是在这样的情况下呢?我是否需要以某种方式覆盖创建操作的load_and_authorize_resource?还是有另一种(阅读:更好)的方式加载@user然后创建@post

3 个答案:

答案 0 :(得分:10)

我认为最佳解决方案,因为这是一个独特的问题,您可以将load_and_authorize_resource行更改为:

load_and_authorize_resource :except => [:create]

对此的行动:

def create
  authorize! :create, Post
  current_user.posts.create(params[:post])
end

答案 1 :(得分:3)

解决问题的更简单方法是使用嵌套资源,而不是创建自定义操作

直接取自CanCan Wiki:

Nested-Resources

  

从1.4开始,也可以通过方法嵌套,这是   通常是current_user方法。

 class ProjectsController < ApplicationController
   load_and_authorize_resource :through => :current_user
 end 
     

这里所有内容都将通过current_user.projects关联加载。

这也应该更安全,因为帖子的加载将通过控制器中其他操作的关联来完成

答案 2 :(得分:0)

此解决方案也对我有用

authorize_resource class: 'User'