2011-08-10 47 views
4

試圖設置康康在我的應用程序中,並與我的PostsController有問題。獲取康康的load_and_authorize_resource在自定義創建動作中工作

簡而言之,當創建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

一個更簡單的解決方案您的問題是使用嵌套資源,而不是創建自定義動作

直接從CanCan Wiki中取得:

Nested-Resources

從1.4版本,它也可以通過嵌套的方法,這是 常用的方法CURRENT_USER。

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

這裏一切都會通過current_user.projects關聯加載。

這應該是更安全的爲好,作爲一名內線的負載將通過聯想的其他動作在你的控制器

+0

如果從控制器訪問另一個用戶的項目,會出現錯誤。這是拋出錯誤'無法找到項目與'ID'= [WHERE'項目''''用戶ID ='] ' –

10

我認爲最好的辦法,因爲這是一個獨特的問題,因爲你改變load_and_authorize_resource線,以這樣的:

load_and_authorize_resource :except => [:create] 

和動作這樣:

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

IC來完成。謝謝。我會盡力... – Meltemi

+0

對我很好。您可以添加:new to:除了以外。 – gfreezy