Подтвердить что ты не робот

Как проверить, нет ли объекта в представлении Ruby?

Я хотел бы отобразить строку текста, только если установлен объект с именем @foo. На мой взгляд, я пытаюсь сделать что-то вроде этого:

<% if [email protected]_record? || [email protected]? %>
    Foo is not a new record or nil
<% end %>

Но это не удается, возвращая You have a nil object when you didn't expect it! Я уверен, что это происходит из-за метода new_record?. Как проверить, что что-то не является новой записью или нолем, не вызывая ошибки? В PHP это будет достигнуто путем запроса if(!empty($foo)), но даже метод empty? в рельсах заставляет возвращать ту же ошибку.

Любые идеи?

4b9b3361

Ответ 1

Как насчет:

<% if [email protected]? && [email protected]_record? %>
  Hello!
<% end %>

Во-первых, вам нужно использовать логику AND, а не логику OR, поскольку любой объект ActiveRecord удовлетворяет хотя бы одному требованию "не ноль" или "не новая запись".

Во-вторых, сначала проверка на nil гарантирует, что вторая проверка не будет выполняться, если первая не удалась. Ошибка вызывается из-за того, что вы не можете использовать #new_record? для объекта, который ее не поддерживает, поэтому сначала проверка на nil гарантирует, что этот метод никогда не будет выполняться на нуле.

Ответ 2

Вы также можете быть заинтересованы в них:

<%= @foo.text if @foo.present? %>

или

<%= @foo.text unless @foo.blank? %>

Ответ 3

Позвольте мне задать другой ответ просто для удовольствия.

unless @foo.nil? or @foo.new_record?
  "Hello"
end

Ответ 4

Я бы проверял if @foo && @foo.id. Это проверяет наличие объекта @foo activerecord и гарантирует, что поле id не пустое. Если поле id пустое, это значит, что это еще не запись в базе данных. Я предполагаю, что вы используете поле id в таблице.

Ответ 5

Простым способом является

<% if [email protected](:new_record) %>
  Hello!
<% end %>

Ответ 6

Есть ли причина, по которой этот объект может отсутствовать, когда он попадает в представление? Иногда добавление условной логики, как это в представлении, может быть признаком того, что что-то может быть реорганизовано, и вы просто маскируете большую проблему.

Ответ 7

Я предпочитаю использовать andand gem для этих проверок.

if @foo.andand.id
  "Hello!"
end

Вызов для .id будет выполняться только для объектов, отличных от nil.