Как проверить, является ли объект нулевым в представлении в Ruby? - PullRequest
12 голосов
/ 27 февраля 2010

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

<% if !@foo.new_record? || !@foo.nil? %>
    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? в rails приводит к возвращению той же ошибки.

Есть идеи?

Ответы [ 7 ]

13 голосов
/ 27 февраля 2010

Как насчет:

<% if !@foo.nil? && !@foo.new_record? %>
  Hello!
<% end %>

Прежде всего, вам необходимо использовать логику AND, а не логику OR, поскольку любой объект ActiveRecord соответствует по крайней мере одному из требований "not nil" или "not new record".

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

3 голосов
/ 27 февраля 2010

Вас также могут заинтересовать эти вопросы:

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

или

<%= @foo.text unless @foo.blank? %>
2 голосов
/ 01 марта 2010

Позвольте мне бросить еще один ответ просто для удовольствия.

unless @foo.nil? or @foo.new_record?
  "Hello"
end
1 голос
/ 27 февраля 2010

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

1 голос
/ 27 февраля 2010

Простой способ -

<% if !@foo.try(:new_record) %>
  Hello!
<% end %>
1 голос
/ 27 февраля 2010

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

0 голосов
/ 01 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...