试图在我的应用中设置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
?
对您的问题的一个更简单的解决方案是使用嵌套资源,而不是创建自定义操作
直接取自CanCan Wiki:
从1.4开始,也可以通过方法嵌套,这是通常是current_user方法。
class ProjectsController < ApplicationController load_and_authorize_resource :through => :current_user end
这里所有内容都将通过current_user.projects关联加载。
这也应该更安全,因为帖子的加载将通过关联完成,以进行控制器中的其他操作
我认为最好的解决方案,因为这是一个独特的问题,您可以将load_and_authorize_resource
行更改为此:
load_and_authorize_resource :except => [:create]
以及对此的操作:
def create
authorize! :create, Post
current_user.posts.create(params[:post])
end
此解决方案也对我有用
authorize_resource类:'用户'