Как я могу отобразить атрибут вложенного объекта на последнем в Rails 4

#ruby-on-rails #nested

#ruby-on-rails #вложенный

Вопрос:

У меня есть две модели: клиент имеет статус_many во вложенных отношениях.

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

Я попробовал две вещи:

Во-первых: <%= client.statuses.last.name %> «last» в данном случае является не атрибутом, а методом «last» из ruby api

И второе: я создал метод клиентской модели

 def latest_status
  current = self.statuses.last
  return current
end 
 

а затем в представлении:

 <%= client.latest_status.name %>
 

Оба возвращают:

 undefined method `name' for nil:NilClass
 

Предостережение заключается в том, что если я запускаю debug (client.statuses.last) в представлении, он выводит attrs из правильного статуса.

— РЕДАКТИРОВАТЬ статус пользователя has_many:statuses Статус принадлежит пользователю

Это ассоциации моделей.

запуск debug (client.statuses.last) возвращает:

 --- !ruby/object:Status
attributes:
 id: 6
 name: Prospect
 value: 40000
 created_at: 2014-06-20 20:03:14.904934000 Z
 updated_at: 2014-06-20 20:03:14.904934000 Z
 client_id: 1
 

но я не могу получить доступ к атрибуту ‘name’ с помощью ‘last’.

— Редактировать 6/20 Я продолжаю пытаться сделать это, и мне удалось добиться части решения, но я не думаю, что оно очень масштабируемо.

  <% client.statuses.each_with_index do |s, i| %>
        <% if i == 0 %>
          <%= s.name %>
        <% end %>
      <% end %>
 

Выполняя простой цикл .each_with_index, я могу получить доступ к первому элементу или последнему объекту. Но если было много вложенных элементов. Я чувствую, что это был бы очень большой запрос. В этом случае мне нужен только самый последний.

Комментарии:

1. Какие у вас Client Status модели и?

2. Да, этого недостаточно для решения проблемы.

3. Добавлены отношения модели. мои извинения.

4. Нам нужно немного больше информации. Что вы подразумеваете под «Но если я просто debug ( client.statuses.last ), он возвращает правильный результат»? Можете ли вы показать все представление, содержащее строку в рассматриваемом коде, и весь метод контроллера для этого представления?

5. вы проверили, что все клиенты действительно имеют хотя бы один статус? Если в вашей коллекции есть один клиент, не имеющий статуса, вы увидите упомянутое вами сообщение об ошибке. попробуйте изменить команду на client.statuses.last.name if client.statuses.any? или короче: client.statuses.last.try :name

Ответ №1:

Ваш код представления не проверяет, имеет ли клиент какой-либо статус, поэтому, если хотя бы один клиент в вашей коллекции не имеет статуса, вызов last его вернет nil и, таким образом, выдаст ошибку, которую вы видите.

Решите это, либо явно проверив наличие статусов:

 client.statuses.last.name if client.statuses.any?
 

или, короче говоря, с

 client.statuses.last.try :name