Rails CanCan和Scoped attr_protected

时间:2012-07-30 17:41:32

标签: ruby-on-rails cancan

我使用CanCan 1.6获得了Rails 3.1应用程序。我用attr_protected ... :as => :api保护了各种属性。我想使用load_and_authorize_resource,但也要删除受保护的字段。有什么想法吗?

编辑:这是我目前的解决方法:

在订单#new中,我正在跳过load_resource并且只是授权。我使用适当的范围直接初始化新订单:

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

然后手动设置用户:

@order.user = current_user

当然不是一件大事,但不像让CanCan本地加载和授权那样优雅,就像我在其他地方一样。

1 个答案:

答案 0 :(得分: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

没有时间对第二部分进行全面测试,但这应该会让你朝着正确的方向前进。