1

3 개의 테이블로 작업하고 있습니다. HABTM 설정에서 사용자, 역할 및 역할을 정의합니다.레일 3, HABTM 및 데이터 표시

모든 사용자의 역할을 표시하려고합니다.

user.rb 모델

class User < ActiveRecord::Base 

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

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

    def role?(role) 
    return !!self.roles.find_by_name(role.to_s.camelize) 
    end 

end 

모델

role.rb
class Role < ActiveRecord::Base 
    attr_accessible :role_name 
    has_and_belongs_to_many :users 

end 

users_controller.rb 컨트롤러

class UsersController < ApplicationController 
# GET /users 
    # GET /users.xml 

#load_and_authorize_resource 

    def index 
    # @user = User.find(params[:id]) 
    #@user.roles 
    @users = User.all 
    @roles = Role.all 
    respond_to do |format| 
     format.html # index.html.erb 
    format.xml { render :xml => @users } 
end 
    end 

    # GET /users/1 
    # GET /users/1.xml 

def show 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @user } 
    end 
    end 

나는 새 사용자를 만들고 그에게 역할을 할당 할 수 있습니다. 나는 사용자를 편집하고 그의 역할을 바꿀 수있다. 쇼를 사용하여 개별 사용자 역할을 볼 수 있습니다.

문제는 모든 사용자와 해당 역할을 표시하려고하는 index.html.erb 파일 때문입니다.

다음은 코드입니다. 그래서

[email protected] john  [#<Role id: 1, role_name: "basic_user", created_at: "2012-12-06 18:03:43", updated_at: "2012-12-06 18:03:43">] Show Edit Destroy 

대신 행 나에게 전체 역할을주고있다 :

../views/users/index.html.erb

목록 사용자

<table> 
    <tr> 
    <th>ID</th> 
    <th>Email</th> 
    <th>Username</th> 
    <th>Role </th> 
    <th>Role ID</th>> 
    </tr> 

    <% @users.each do |user| %> 
    <tr> 
    <td><%= user.id %></td> 
     <%= current_user = user.id %> 
     <td><%= user.email %></td> 
     <td><%= user.username %></td> 
    <td> <%= User.find(user.id).roles %> </td> 
     <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 %> 
</table> 

<br /> 

이이 출력을 생성 role_name의

나는 User.find (user.id) .roles.role_name, User.find (user.id) .roles [1] 및 몇 가지 다른 가능성을 시도했지만 역할 이름 만 가져 오는 방법을 알아낼 수 없습니다. 표시하는.

[email protected] john  basic_user  Show Edit Destroy 

감사 : 그냥 'ROLE_NAME'는 같은 표시 얻을 수있는 올바른 구문은 무엇

!

답변

3

당신은 직접 액세스 할 수 있습니다

<td> <%= user.roles.collect(&:name).join(",") %> </td> 
+0

감사합니다! 나는 collect 메소드를 시도했지만 & 또는 .join을 사용하는 것을 알지 못했습니다. 나는 가까이에 있었지만 고비를 극복 할 수 없다는 것을 알았다. – user1886476

+0

괜찮 으면 내 대답을 확인하는 경우 작동합니다 :) – Lichtamberg

+0

죄송합니다. 전에 스택 오버플로에 게시하지 마십시오. 다시 한 번 감사드립니다! – user1886476