尝试在我的应用中设置 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
?
答案 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:
从1.4开始,也可以通过方法嵌套,这是 通常是current_user方法。
class ProjectsController < ApplicationController load_and_authorize_resource :through => :current_user end
这里所有内容都将通过current_user.projects关联加载。
这也应该更安全,因为帖子的加载将通过控制器中其他操作的关联来完成
答案 2 :(得分:0)
此解决方案也对我有用
authorize_resource class: 'User'