#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