1

我正在使用 rails 3.2.3 并在我的应用程序中获取奇怪的值。

我有 2 个模型,一个用户和角色,它们是 has_and_belongs_to_many 关系。中间表是使用 role_id 和 user_id 列以及正确的名称 (roles_users) 创建的。

问题是,当我将用户分配给一个角色(通过复选框创建时)然后查看所有具有与其相关联的角色的用户时,我得到无效的角色 ID(如 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 %>

问题是,这会显示一些随机数,例如 69067380,而不是角色 id (1)。如果我刷新,这个数字会变成另一个随机数。至于角色名称,它总是说“角色”而不是“管理员”。这让我想起了一个指针内存地址,但我怀疑是这样。

注意:当我使用 MySQL 工作台检查表时,一切都很好,表中的所有值都是正确的。

任何帮助表示赞赏,在此先感谢

4

2 回答 2

2

你的用户有很多角色,所以当你触发user.roles它时,它会给出一个数组而不是单条记录user.roles.first,或者user.roles.first.try(:name)它显示第一个角色。你可以迭代角色并根据你的要求显示它们。

于 2012-04-27T10:15:40.907 回答
1

user.roles.id是关系本身的 id 。user.roles.fist.id您应该通过使用或其他方式选择其中一个角色。一个用户可以有多个角色,您可能希望将它们全部打印出来,并带有一个循环。

于 2012-04-27T10:18:57.867 回答