1

Rails 3.2.3を使用していて、アプリで奇妙な値を取得しています。

has_and_belongs_to_many 関係である、ユーザーとロールの 2 つのモデルがあります。中央のテーブルは、role_id および user_id 列と正しい名前 (roles_users) で作成されます。

問題は、(チェックボックスを使用して作成時に) ユーザーを役割に割り当て、それらに関連付けられた役割を持つすべてのユーザーを表示すると、無効な役割 ID (1 または 2 の場合は 75216410 など) と役割が表示されることです。 name は admin ではなく "Role" です。

Devise と CanCan を使用したいのですが、Devise をセットアップしましたが、これが邪魔です。

私のロールとユーザーのコントローラーには、従来の restfull アクションがあり、スキャフォールディング時に得られるアクションとまったく同じです。DB の値は正しいので、これは問題ではないと思います。

私のモデルは次のとおりです。

user.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

role.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 %>

問題は、ロール ID (1) の代わりに、69067380 のような乱数が表示されることです。更新すると、この数字は別の乱数に変わります。ロール名については、「admin」ではなく常に「Role」と表示されます。これはポインタメモリアドレスを思い出させますが、そうではないかと思います。

注: 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または何かを使用して、役割の1つを選択する必要があります。1 人のユーザーが多くのロールを持つことができます。おそらく、それらすべてをサイクルで印刷したいと思うでしょう。

于 2012-04-27T10:18:57.867 に答える