2012-07-30 67 views
0

我有一個使用CanCan 1.6的Rails 3.1應用程序。我使用attr_protected ... :as => :api來保護各種屬性。我想使用load_and_authorize_resource,但也剝離受保護的領域。有任何想法嗎?Rails CanCan和Scoped attr_protected

編輯:這是我目前的解決方法:

在訂單#新的,我跳過load_resource,只是授權。我直接初始化新的秩序,用適當的範圍:

@order = Order.new(params[:order], :as => :api)

然後手動設置的用戶:

@order.user = current_user

當然不是一個巨大的交易做的,但不是讓那麼優雅CanCan可以本地加載和授權,就像我在其他地方所做的那樣。

回答

0

通常,如果您只有幾個要提交的受保護字段,將其從參數哈希值中拉出並手動分配它將會更容易。

##save the parameter and delete it from the hash 
role  = params[:employee][:role_id] 
params[:employee].delete("role_id") 

##create object and assign parameter manually 
@employee = Employee.new(params[:employee]) 
@employee.role_id = role 

如果您有很多屬性,可以自動執行手動分配。

##list protected attributes and create new employee 
attr = Employee.protected_attributes ##["id", "type", "name"] 

@employee = Employee.new 

##loop through params and manually send value 
params[:employee].each do |p| 
    @employee.send("#{p}=", params[:employee]["#{p}"]) 
end 

沒有足夠的時間來完全測試第二部分,但是這應該讓你朝正確的方向發展。

+0

感謝Kosmonaut的洞察力。不幸的是,這個解決方案不適用於嵌套資源,在這種情況下,我實際上正在使用它。 我已經使用目前的解決方法更新了我的帖子,但我希望能比我的解決方案更優雅。如果不是嵌套,你的解決方案將工作得很好。 – ideaoforder 2012-08-01 16:41:58