2011-06-28 51 views
0

我使用Railscasts 189的代碼來實現Devise角色,因此我可以使用Cancan。但角色不會保存到role_mask字段。從我的用戶模型相關代碼:Rails 3: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中有很多關於「無法批量分配受保護的屬性」的問題,但它們似乎與這種情況密切相關。

有什麼建議嗎?

回答

2

嘗試增加:角色的attr_accessible名單如下:

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

完全明白這樣做在此之前大衆分配的問題。

+0

工作。不知道我明白爲什麼。這是因爲「角色=(角色)」和「角色」方法是作爲一個setter/getter對嗎? –

+1

@dleatham http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html#method-i-attr_accessible – felix

相關問題