Ruby on rails 3 Rails 3:role#u mask won';t保存-警告:Can';t批量分配受保护的属性:角色

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

我正在使用Railscasts 189中的代码来实现Desive的角色,这样我就可以使用Cancan了。但是,未将角色保存到角色掩码字段。我的用户模型中的相关代码:

  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