Hi,

(Using Rails 4.0.1, Ruby 1.9.3, latest devise and cancan gems. sqlite db 
for local development)

I am a rookie, setting up website and was adding roles(using cancan gem) to 
my users table. Everything works great, except when I select a role for a 
user it is not getting saved. The user gets saved/created OK but it never 
updates/ remembers any roles assigned to the user.

I was following the advice given here(Many roles per user). Any help or 
advice is most appreciated...

https://github.com/ryanb/cancan/wiki/role-based-authorization

Here is my users form...

<%= form_for(@user) do |f| %>
<div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <% if @current_method == "new" %>
    <div class="field">
      <%= f.label :password %><br />
      <%= f.password_field :password %>
    </div>
    <div class="field">
      <%= f.label :password_confirmation %><br />
      <%= f.password_field :password_confirmation %>
    </div>
  <% end %>
  <% for role in User::ROLES %>
    <%= check_box_tag "user[roles][#{role}]", role, 
@user.roles.include?(role), {:name => "user[roles][]"}%>
    <%= label_tag "user_roles_#{role}", role.humanize %><br />
  <% end %>
  <%= hidden_field_tag "user[roles][]", "" %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>



# /app/model/user.rb

class User < ActiveRecord::Base

  ROLES = %w[admin blog_author]

  def roles=(roles)
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) 
}.inject(0, :+)
  end

  def roles
    ROLES.reject do |r|
      ((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
    end
  end

  def is?(role)
    roles.include?(role.to_s)
  end

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable, 
:rememberable, :trackable, :validatable
end

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/681b5ccf-1743-4cf3-89e4-495ee057ad31%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to