Ruby on rails 3 Rails 3:role#u mask won';t保存-警告:Can';t批量分配受保护的属性:角色
我正在使用Railscasts 189中的代码来实现Desive的角色,这样我就可以使用Cancan了。但是,未将角色保存到角色掩码字段。我的用户模型中的相关代码:Ruby on rails 3 Rails 3:role#u mask won';t保存-警告:Can';t批量分配受保护的属性:角色,ruby-on-rails-3,attributes,devise,cancan,Ruby On Rails 3,Attributes,Devise,Cancan,我正在使用Railscasts 189中的代码来实现Desive的角色,这样我就可以使用Cancan了。但是,未将角色保存到角色掩码字段。我的用户模型中的相关代码: attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :about, :awards, :url, :roles_mask ROLES = %w[admin support work
attr_accessible :email, :password, :password_confirmation, :remember_me,
:name, :about, :awards, :url, :roles_mask
ROLES = %w[admin support worker monitor visitor]
named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0"} }
def roles=(roles)
self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
end
def roles
ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }
end
def role_symbols
roles.map(&:to_sym)
end
在用户“新建”和“编辑”的视图中,我可以显示以下角色的复选框:
<p>
<%= f.label :roles %><br />
<% for role in User::ROLES %>
<%= check_box_tag "user[roles][]", role, @user.roles.include?(role) %>
<%=h role.humanize %><br />
<% end %>
<%= hidden_field_tag "user[roles][]", "" %>
</p>
当我选中几个角色的复选框并点击“提交”时,我得到以下闪光:
1错误禁止保存此用户:
我从服务器上得到以下错误:
警告:无法批量分配受保护的属性:角色
我已经检查了数据库,但在角色掩码字段中没有保存任何内容。Stackoverflow中有很多关于“不能批量分配受保护的属性”的问题,但它们似乎与这种情况没有关系
有什么建议吗?尝试将:角色添加到属性可访问列表中,如下所示:
attr_accessible :email, :password, :password_confirmation, :remember_me,
:name, :about, :awards, :url, :roles_mask, :roles
在进行此操作之前,请完全了解质量分配问题。这很有效。我不知道为什么。是因为“roles=(roles)”和“roles”方法充当setter/getter对吗?@dleatham