Rails 3: придумать флажки добавления ролей в регистрационную форму - PullRequest
2 голосов
/ 07 января 2011

Я использую Devise для регистрации пользователей. Я читал всем известный учебник о настройке Devise, но не могу понять эту простую задачу. Я следовал за его моделью (HABTM)

Я хочу добавить флажок ролей в форму редактирования Devise. У меня нет контроллера, потому что Devise его не предоставляет, но ему удалось добавить роль по умолчанию для новых пользователей. Мне удалось отобразить флажки с проверенной правильной информацией, но я не могу изменить ее (она не сохранит никаких данных). Нужен ли пользовательский контроллер? если да, то как именно? Я новичок в отношениях HABTM!

Модель "Мой пользователь"

    class User < ActiveRecord::Base
  has_and_belongs_to_many :roles

  before_save :setup_role

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

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me

  def role?(role_sym)
    roles.any? { |r| r.name.underscore.to_sym == role_sym }
  end

  # Default role is "User"
  def setup_role 
    if self.role_ids.empty?     
      self.role_ids = [3] 
    end
  end


end

Моя форма редактирования (devise / registrations / edit.html.rb

    <h2>Edit <%= resource_name.to_s.humanize %></h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
  <%= devise_error_messages! %>

  <p><%= f.label :email %><br />
  <%= f.text_field :email %></p>

  <p><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
  <%= f.password_field :password %></p>

  <p><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></p>

  <p><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password %></p>

    <% for role in Role.find(:all) %> 
        <div> 
          <%= check_box_tag "user[role_ids][]", role.id, @user.roles.include?(role) %> 
          <%= role.name %> 
        </div> 
    <% end %>

  <p><%= f.submit "Update" %></p>
<% end %>

<h3>Cancel my account</h3>

<p>Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.</p>

<%= link_to "Back", :back %>

1 Ответ

1 голос
/ 15 января 2011

проверьте вашу консоль, я получаю сообщение об ошибке «Невозможно массовое назначение», затем помещаю: role_ids в attr_accessible модели пользователя, и оно работает.

...