Как проверить, нет ли объекта в представлении 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?
в рельсах заставляет возвращать ту же ошибку.
Любые идеи?
Ответы
Ответ 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.