我花了很长时间弄清楚如何在创建新记录期间通过 CanCan 获取虚拟属性:
我有 Teams,带有 :name 和 :description
团队通过成员资格拥有用户,我通过单独的控制器操作进行控制,并将数据保存在我称为“member_selections”的参数中,其中包含带有非特定键的哈希(user_id => 角色)。
因此:我的参数哈希可能如下所示:
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 是否有其他问题?我怎样才能解决这个问题?