2013-05-03 3 views
-1

У меня есть HTML-код в моем приложении Rails, который выглядит следующим образом:Комбинирование HTML и рубин

<td><%= MyObj.find_by_id(@my_obj.some_id).name %></td> 

И это проявляется штраф. Однако поле some_id не всегда присутствует в базе данных, поэтому в таких случаях я бы хотел отображать NA, а не MyObj.

Итак, вот что я имею в виду в псевдокоде:

<td><%= IF @my_obj.some_id is NIL THEN "NA" ELSE MyObj.find_by_id(@my_obj.some_id).name %></td> 

Как я могу это сделать?

+1

Um, ваш псевдокод имеет довольно прямой перевод на Ruby, и материал внутри '' <%= ... %> просто рубин код так ... –

ответ

2

Вы можете использовать следующий фрагмент кода:

<td><%= @my_obj.some_id.present? ? MyObj.find(@my_obj.some_id).name : 'NA' %></td> 

Однако, вы подвергаете себя некоторые довольно большие вопросы, если вы найти записи в вашем просмотра кода, как это. Ваш контроллер должен обрабатывать такую ​​логику.

+0

здорово, спасибо , Я не знал, что вы могли бы что-то сделать в рубине. – CodeGuy

+0

@CodeGuy Просто прислушайтесь к предупреждению - только потому, что вы можете сделать что-то подобное в рубине, не значит, что вам нужно. –

1

Вы не должны бить базу данных в своем коде зрения, оставьте это на своих контроллерах. Попробуйте загрузить объект в контроллере вместо:

# use this code to your controller 
@view_obj = MyObj.find_by_id(@my_obj.some_id) 

Вы можете использовать метод try установить имя, которое будет возвращать nil вместо повышения обычного NoMethodError если объект nil:

<%= @view_obj.try(:name) || "NA" %> 
-2

<% =! MyObj.find_by_id (@ my_obj.some_id) .name.blank? ? MyObj.find_by_id (@ my_obj.some_id) .name: "NA" %>

+1

Это вызовет исключение 'NoMethodError', если' MyObj.find_by_id (@ my_obj.some_id) 'возвращает' nil', и это именно та ситуация, о которой идет речь. –

+0

<% = MyObj.find_by_id (@ my_obj.some_id)! = Nil &&! MyObj.find_by_id (@ my_obj.some_id) .name.blank? ? MyObj.find_by_id (@ my_obj.some_id) .name: "NA"%> – Kushal

+0

Если вы хотите сделать это таким образом, это должно быть просто '<% = MyObj.find_by_id (@ my_obj.some_id) .nil? ? «NA»: MyObj.find_by_id (@my_obj_some_id) .name%> '- из вопроса нет необходимости проверять, пустое ли имя или нет, просто если объект существует. Вы также попадаете в базу данных несколько раз в той строке, которая не является хорошей идеей (уверен, что она, вероятно, будет кэшироваться, но все же), особенно в представлении. –

Смежные вопросы