Rails рекомендует проверять существование объекта перед отображением атрибута в макете - PullRequest
3 голосов
/ 10 августа 2010

У меня есть следующий код в макете:

Posted <%=time_ago_in_words post.created_at %> ago 
<% if post.has_tag != nil %>
   in the <%= post.get_first_tag.name %> category
<% end %>

И следующий код в модели поста, который наследует форму ActiveRecord :: Base

def has_tag
 !self.tags.empty?   
end

def get_first_tag
 self.tags[0]   
end 

Теги также наследуютсяиз тегов ActiveRecord :: Base и Post 'has_many'

Во-первых: это лучший способ проверить, имеет ли объект post хотя бы 1 атрибут ассоциированного тега.

Во-вторых: Должен ли я поместитьэта логика в вспомогательный метод?

В-третьих: почему не работает следующее (он возвращает #, где должны быть теги):

in the <%= post.tags.to_sentence %> category, 

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


Ответы [ 2 ]

4 голосов
/ 10 августа 2010

Это очень хороший способ проверить, есть ли теги или нет. Однако self.tags.empty? вернет true или false, поэтому post.has_tag никогда не будет nil.

Стоит отметить, что в ruby ​​обычно называют методы, которые возвращают true или false с вопросительным знаком. Так что post.has_tag? будет лучшим именем для вашего метода (например, метод empty? для тегов).

Этот вид метода принадлежит классу модели, а не помощнику, поскольку он не является специфическим для уровня представления; вы можете вызвать этот метод из других классов модели, например.

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

post.tags.map(&:name).to_sentence

, который возьмет имена тегов и превратит их в предложение.

1 голос
/ 10 августа 2010

С одной стороны, вам, вероятно, нужно

<% if post.has_tag %>

вместо

<% if post.has_tag != nil %>

В вашем определении has_tag никогда не должно возвращать nil и, следовательно, 'в.... 'часть всегда будет показана.

Как правило, ваша идея мне подходит: я часто добавляю таких помощников в модели.

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