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

Mel*_*emi 4 ruby-on-rails cancan ruby-on-rails-3

试图在我的应用程序中设置Cancan并且遇到问题PostsController.

简而言之,当a 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
Run Code Online (Sandbox Code Playgroud)

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

Dra*_*ken 10

我认为最好的解决方案,因为这是一个独特的问题,你可以改变load_and_authorize_resource这一点:

load_and_authorize_resource :except => [:create]
Run Code Online (Sandbox Code Playgroud)

对此的行动:

def create
  authorize! :create, Post
  current_user.posts.create(params[:post])
end
Run Code Online (Sandbox Code Playgroud)


小智 3

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

直接取自 CanCan Wiki:

嵌套资源

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

 class ProjectsController < ApplicationController
   load_and_authorize_resource :through => :current_user
 end 
Run Code Online (Sandbox Code Playgroud)

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

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