2012-01-17 3 views
0

Я пытаюсь создать ассоциацию User-Infos, где у меня есть информация о пользователе.Ruby on Rails - получение данных ассоциации

Я пытаюсь вызвать информацию о пользователе в форме индекса от пользователей.

Позвонив <%= user.infos %> на моем index.html.erb (Пользователи) он возвращает мне все ДАННЫЕ из таблицы Infos так:

[#<Info id: 2, name: "Thales Miguel", date: "1989-07-14", area: "An\xC3\xA1lise de Sistemas", comment: "Analista j\xC3\xBAnior de sistemas.", user_id: 1, created_at: "2012-01-16 15:54:29", updated_at: "2012-01-16 15:54:29">] 

Я предположил, что, делая <%= user.infos.comment %> было бы вернуть мне «комментарий» от этого пользователя, но все, что я получаю, это ошибка:

undefined method `comment' for #<ActiveRecord::Relation:0x3b8ebe8> 

Что я делаю неправильно?

infos_controller:

class InfosController < ApplicationController 

    def create 
    @user = User.find(params[:user_id]) 
    @info = @user.infos.create(params[:info]) 
    redirect_to user_path(@user) 
    end 

    def destroy 
    @user = User.find(params[:user_id]) 
    @info = @user.infos.find(params[:id]) 
    @info.destroy 
    redirect_to user_path(@user) 
    end 

    def new 
    @user = User.new 
    @user.build_info  
end 

end 

Информация о модели:

class Info < ActiveRecord::Base 
    belongs_to :user 
end 

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

class User < ActiveRecord::Base 
    validates :login, :presence => true 
    validates :password, :presence => true, 
         :length => {:minimum => 5} 

    has_many :infos, :dependent => :destroy 

end 

ответ

2

Это:

[#<Info id: 2, name: "Thales Miguel", date: "1989-07-14", area: "An\xC3\xA1lise de Sistemas", comment: "Analista j\xC3\xBAnior de sistemas.", user_id: 1, created_at: "2012-01-16 15:54:29", updated_at: "2012-01-16 15:54:29">] 

- массив. Вы должны выбрать один из объектов. Вы не можете вызвать значение атрибута, не выбрав один из этих объектов. Хорошо, в этом случае есть только один объект, но это не имеет значения.

+0

И как мне это? – ThalesMiguel

+0

Ну, если вы знаете, что в этом случае есть только один (true), вызовите 'user.infos.first' или' user.infos.last' или 'user.infos [0]'. Независимо от того, что вам больше всего нравится, вырывать из массива только один объект. Google «ruby array», чтобы найти рубированную документацию по классу массива. – Matt

+0

Это не выглядит «обычным» ... Каков наилучший способ сделать то, что я хочу? Как поместить в объекты? Вы ДЕЙСТВИТЕЛЬНО помогаете мне. СПАСИБО! – ThalesMiguel

1

Вы должны сделать это так:

<% user.infos.each do |info| %> 
    <%= info.comment %> 
<% end %> 

Как DavidB сказал, <% user.infos %> возвращает массив. Объектом .comment должен быть экземпляр.

+0

Это действительно работает. Проблема в том, что, делая это, я заставляю пользователя иметь информацию. Есть ли способ не заставлять его? – ThalesMiguel

+0

Попробуйте обернуть вышеуказанный код '<%, если только user.infos.nil? %> 'и' <% end %> '. – Marco

+0

Я пробовал «если пользователь user.infos.nil?» и это не сработало. Мой код сейчас: <% @ users.each do | user | %> \t <% if user.infos.nil? %> \t \t <% user.infos.each do | info | %> \t \t \t \t <% =% user.login> \t \t <% =% user.password> \t \t <% = info.name.force_encoding ("UTF-8")%> \t \t <% = link_to 'Detalhes', пользователь%> \t \t <% = link_to 'Editar', edit_user_path (Пользователь)%> \t \t <% = link_to 'Excluir', пользователь, подтверждают: 'Tem certeza?', метод: Удаление%> \t \t \t \t <% end %> \t <% end %> <% end %> – ThalesMiguel

1

Проблема заключается в том

info is a relationship link

, который возвращает массив инфо-записи, если вы хотите, чтобы показать первый, например

user.infos[0].comment 

или

user.infos.first.comment 

если пользователь не иметь информации, затем возвращать нуль

2

Так, собирая всю информацию, что написано выше:

Вы не можете позвонить user.infos.comment, поскольку возвращаемое значение user.infos является ActiveRecord::Relation в Rails 3.2 и массив в Rails 3.1 и ниже. Ни ActiveRecord :: Relation, ни array не знают, что он должен делать с помощью метода comment, потому что они ничего не знают об содержащихся объектах.

У вас есть несколько решений для решения этой проблемы.

Если пользователь ограничен только одна информация:

class User < ActiveRecord::Base 
    has_one :info, :dependent => :destroy 
end 

<%= user.info.comment %> 

Если пользователь может иметь несколько объектов Информация:

<%- user.infos.each do |info| %> 
<%= info.comment %> 
<% end -%> 

Или

<ul><li> 
<%= user.infos.collect(&:comment).join('</li><li>').html_safe %> 
</li></ul> 

Или, если вы хотите отобразить только первая информация:

<%= user.infos.any? ? user.infos.first.comment : "N/A" %> 

Будьте осторожны, последнее решение: user.infos никогда не будет нулевой, но user.infos.first может быть нулевым, поэтому вы должны проверить имеющиеся Infos с user.infos.any?

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