2

我花了很长时间弄清楚如何在创建新记录期间通过 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 是否有其他问题?我怎样才能解决这个问题?

谢谢!

4

1 回答 1

4

我认为您需要在您的团队模型中添加一个 attr_accessor

attr_accessor :member_selection
于 2013-09-26T13:16:18.767 回答