2013-03-22 4 views
0

У меня есть модель пользователя, которая has_many взломала и взломала принадлежность пользователю. В Hack есть поле user_id.Рельсы доступа к записи с использованием belongs_to

У меня есть static_pages_controller с домашним действия:

def home 
    @hacks = Hack.all 
    @users = User.all 
end 

Модель пользователя является:

class User < ActiveRecord::Base 
    attr_accessible :username, :email, :password, :password_confirmation 
    has_secure_password 

    has_many :hacks 
end 

Модель хак:

class Hack < ActiveRecord::Base 
    attr_accessible :hack_name, :serial_ids, :commentary 

    has_many :hacktions, :dependent => :destroy 
    has_many :serials, through: :hacktions 
    belongs_to :user 

    default_scope order: 'hacks.created_at DESC' 

    extend FriendlyId 
    friendly_id :hack_name, use: :slugged 
end 

В представлении я хочу прокрутите хаки, а затем определите связанного с ним пользователя:

<% @hacks.each do |h| %> 
    <span><%= @users.find(h.user_id).username %> 
    <div class = "home-date"><%= h.created_at.strftime("%B %m, %Y - %I:%M %p") %><%= image_tag("housing.png") %></div> 
    <div class = "home-title"><%= link_to h.hack_name, hack_path(h) %></div> 
    <div class = "commentary lead"><%= markdown(h.commentary) %></div> 
<% end %> 

Я получаю следующее сообщение об ошибке:

undefined method `username' for #<Enumerator:0x007fd5078ac7b0> 

Любые идеи, что я делаю неправильно здесь. FYI: имя пользователя является доступным полем из пользовательской модели.

+0

показать свои модели и отношения –

+0

Благодаря Sanny Sin, alestanis по праву обнаружил, что мне нужно было поставить сначала до вызова t o имя пользователя. – JohnGalt

+0

@sanny Sin Я обновил свои модели в сообщении. – JohnGalt

ответ

1

Попробуйте вызвать first на результаты вашего find:

@user.find(h.serial_id).first.username 
+0

Ожидание требуемых 9 минут, пока я не могу отметить это как ответ. Любопытно, почему это работает? – JohnGalt

+1

Потому что, когда вы используете 'find' или' where', он возвращает критерий, а не объект. Когда вы вызываете 'first' в критерии, он возвращает первый найденный объект. Вы также можете вызвать 'last' или' all', например. Вы должны попробовать его в консоли, вы увидите тип и характеристики критериев. – alestanis

+0

Я подозреваю, что при получении пользователя будет использовать неправильный идентификатор (идентификатор взлома). Кажется, что это сработает, но тогда данные будут ошибочными. –

0

Попробуйте изменить:

<span><%= @user.find(h.serial_id).username %> 

в

<span><%= @user.find_by_serial_id(h.serial_id).username %> 
+0

Я исправил свое оригинальное сообщение, чтобы отразить, что я использую h.user_id, а не h.serial.id. Если я использую @ users.find_by_user_id (h.user_id), я получаю undefined метод 'find_by_user_id 'для # , и если я использую @ user.find_by_user_id (h.user_id), я получаю неопределенный метод' find_by_user_id' для nil: NilClass. – JohnGalt

Смежные вопросы