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

问题描述 投票:4回答:3

试图在我的应用中设置Cancan,但对我的PostsController遇到了麻烦。

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

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

ruby-on-rails ruby-on-rails-3 cancan
3个回答
3
投票

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

直接取自CanCan Wiki:

Nested-Resources

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

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

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

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


10
投票

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

load_and_authorize_resource :except => [:create]

以及对此的操作:

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

0
投票

此解决方案也对我有用

authorize_resource类:'用户'

© www.soinside.com 2019 - 2024. All rights reserved.