Ruby on Rails — отношение N к N, странные значения

я использую рельсы 3.2.3 и получаю странные значения в своем приложении.

У меня есть 2 модели, пользователь и роль, которые являются отношением has_and_belongs_to_many. Средняя таблица создается со столбцами role_id и user_id и правильным именем (roles_users).

Дело в том, что когда я назначаю пользователю роль (при создании с помощью флажка), а затем просматриваю всех пользователей со связанными с ними ролями, я получаю неверный идентификатор роли (например, 75216410, когда он должен быть просто 1 или 2) и роль имя просто «Роль» вместо администратора.

Я хочу использовать Devise и CanCan, я настроил Devise, но эта штука не дает мне продолжить.

Контроллер моих ролей и пользователей имеет традиционные действия restfull, точно такие же, которые мы получаем, когда создаем леса. И поскольку значения БД верны, я считаю, что это не проблема.

Мои модели:

пользователь.rb

class User < ActiveRecord::Base
  # Devise modules
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable, :registerable
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable

  #relationships
  has_and_belongs_to_many :roles

  #nested attr
  accepts_nested_attributes_for :roles

  # Accessible (or protected) attr
  attr_accessible :username, :email, :password, :password_confirmation, :remember_me, :role_ids

  # attr_accessible :title, :body


  #validations
  validates :username, :presence => true
  validates :username, :email, :uniqueness => true

end

роль.rb

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
  attr_accessible :name, :user_attributes, :role_id

end

Мои представления пользователей и ролей такие же, как и у строительных лесов. Индекс моих пользователей:

  <% @users.each do |user| %>
    <tr>
      <td><%= user.username %></td>
      <td><%= user.email %></td>
      <td><%= user.roles.id %></td>    #should display "1"
      <td><%= user.roles.name %></td>  #should display "admin"
      <td><%= link_to 'Show', user %></td>
      <td><%= link_to 'Edit', edit_user_path(user) %></td>
      <td><%= link_to 'Destroy', user, :confirm => 'Are you sure?', :method => :delete %></td>
    </tr>
  <% end %>

Дело в том, что это отображает вместо идентификатора роли (1) какое-то случайное число, например 69067380. Если я обновлю, это число изменится на другое случайное число. Что касается имени роли, оно всегда говорит «Роль» вместо «Администратор». Это напоминает мне адрес памяти указателя, но я сомневаюсь, что это так.

ПРИМЕЧАНИЕ. Когда я проверяю таблицы с помощью MySQL Workbench, все в порядке, и все значения в таблицах верны.

Любая помощь приветствуется, заранее спасибо


person Silver    schedule 27.04.2012    source источник


Ответы (2)


У вашего пользователя много ролей, поэтому, когда вы запускаете user.roles, он выдает массив вместо одной записи, попробуйте user.roles.first или user.roles.first.try(:name), он отображает первую роль. Вы можете повторять роли и отображать их в соответствии с вашими требованиями.

person Amar    schedule 27.04.2012
comment
Кажется, я все-таки запутался в отношениях. Может быть, 1 ко многим было бы лучше, но в любом случае спасибо за объяснение. - person Silver; 27.04.2012

user.roles.id — это идентификатор самого отношения. Вы должны выбрать одну из ролей, используя user.roles.fist.id или что-то в этом роде. У одного пользователя может быть много ролей, возможно, вы захотите вывести их все с циклом.

person Matzi    schedule 27.04.2012
comment
Спасибо и за объяснение. - person Silver; 27.04.2012