Ruby on Rails - получение данных ассоциации - PullRequest
0 голосов
/ 17 января 2012

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

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

Вызывая<%= user.infos %> в моем index.html.erb (Users) он возвращает мне все данные из таблицы 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

Ответы [ 4 ]

2 голосов
/ 29 августа 2013

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

Вы не можете вызвать user.infos.comment, потому что возвращаемое значение user.infos равно ActiveRecord::Relation в Rails 3.2 и массиву в Rails 3.1 и ниже.Ни ActiveRecord :: Relation, ни массив не знают, что он должен делать с методом 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 может быть нулевым, поэтому вы должны проверить доступную информацию с помощью user.infos.any?

2 голосов
/ 17 января 2012

Это:

[#<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">]

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

1 голос
/ 18 января 2012

Проблема в том, что

информация представляет собой связь

, которая возвращает массив информационных записей, если вы хотите показать первую, например

user.infos[0].comment

или

user.infos.first.comment

, если у этого пользователя нет информации, вернуть nil

1 голос
/ 17 января 2012

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

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

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

...