2012-07-30 65 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