Rails 3:role_mask不会保存 - 警告:无法批量分配受保护的属性:角色

时间:2011-06-28 05:16:05

标签: ruby-on-rails-3 attributes devise cancan

我正在使用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中有很多关于“无法大量分配受保护属性”的问题,但它们似乎与这种情况没有密切关系。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

尝试将:role添加到attr_accessible列表中,如下所示:

attr_accessible :email, :password, :password_confirmation, :remember_me,
                  :name, :about, :awards, :url, :roles_mask, :roles

在此之前完全了解质量分配问题。