【发布时间】:2013-09-25 20:49:36
【问题描述】:
我在搞清楚如何在创建新记录期间通过 CanCan 获取虚拟属性:
我有团队,有 :name 和 :description
团队通过成员资格拥有用户,我通过单独的控制器操作进行控制,并将数据保存在我称为“member_selections”的参数中,其中包含具有非特定键(user_id => 角色)的哈希。
因此:我的 params 哈希可能如下所示:
params[:team] = {name: "Super Team", description: "It is super",
member_selections: {"1"=>"member", "2"=>"leader"}}
我对强参数有常用的 CanCan 解决方案,如下所示: https://github.com/ryanb/cancan/issues/835
为了通过白名单穿透虚拟属性,我使用了这里提到的技术,在底部: http://blog.sensible.io/2013/08/17/strong-parameters-by-example.html
具体来说,我的“team_params”方法如下所示:
def team_params
params.require(:team).permit(:name, :description).tap do |whitelist|
whitelist[:member_selection] = params[:team][:member_selection]
end
end
现在,如果我删除 .tap 和白名单阻止,我可以创建新团队,但不能添加新成员。
如果我保持 .tap,我可以添加新成员,但我无法创建新团队。提交“新”表单会产生以下结果:
ActiveRecord::UnknownAttributeError in TeamsController#create
unknown attribute: member_selection
它甚至在正确调用 TeamsController#create 方法之前就给出了这个错误,所以这不是我将参数错误地传递给 Team.new/.create 的问题,并表明这是一个 CanCan 问题。
还有其他人在 Rails 4 中遇到虚拟属性和 CanCan 的问题吗?我该如何解决这个问题?
谢谢!
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 cancan strong-parameters virtual-attribute