我正在使用Railscasts 189中的代码来实现Devise的角色,所以我可以使用Cancan。但是,角色未保存到role_mask字段。来自我的用户模型的相关代码:
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错误禁止此用户被保存:
我从服务器收到以下错误: 警告:无法批量分配受保护的属性:角色
我检查了数据库,没有任何内容保存在roles_mask字段中。 Stackoverflow中有很多关于“无法大量分配受保护属性”的问题,但它们似乎与这种情况没有密切关系。
有什么建议吗?
答案 0 :(得分:2)
尝试将:role添加到attr_accessible列表中,如下所示:
attr_accessible :email, :password, :password_confirmation, :remember_me,
:name, :about, :awards, :url, :roles_mask, :roles
在此之前完全了解质量分配问题。