2010-04-15 2 views
3

Say У меня есть модель пользователя, и есть куча информации о пользователе, как электронная почта, дата рождения, расположение, номер телефона и т.д.Показывать только непустых атрибуты модели в представлениях в Rails

Что это самый простой способ скрывая атрибуты, которые пусты?

Я делаю что-то вроде

<% if blog.title.empty? -%> 
<p>Body: <%=h blog.body %></p> 
<p>Comments: <%=h blog.comments %></p> 

<% elsif blog.body.empty? %> 
<p>Title: <%=h blog.title %></p> 
<p>Comments: <%=h blog.comments %></p> 

<% else -%> 
<p>Title: <%=h blog.title %></p> 
<p>Body: <%=h blog.body %></p> 
<% end -%> 

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

Я пытался написать метод helpher, чтобы сделать просмотр более чистым, но это еще более уродливо.

Любая помощь приветствуется.

+0

вы не можете сделать это с помощью if-другое состояние. потому что, если ваше условие IF получится истинным независимо от других условий ELSIF, оно не будет выполнено. для:: название и тело оба не пусты, но вы можете видеть только заголовок. – Salil

+0

На самом деле это сработало для меня. Если бы одно совпадало, я бы не хотел, чтобы другие были выполнены, или у меня было бы три экземпляра каждой записи. Все было в блоге в блогах @blogs, поэтому для каждого примера это шаг за шагом, останавливаясь, если кто-то вернул true. –

ответ

3

Я хотел бы сделать это следующим образом:

# blog_helper.rb 
show_non_blank_field(label, value) 
    "<p>#{label}: #{h value}</p>" if !value.blank? 
end 

, а затем в виде:

<%= show_non_blank_field "Body", blog.body %> 

и так далее ...

Конечно, вы можете использовать более короткое имя помощника.

Если вы хотите сделать это в if-else образом, попробуйте это:

<% if !blog.title.blank? -%> 
<p>Title: <%=h blog.title %></p> 
<% end %> 

<% if !blog.body.blank? %> 
<p>Body: <%=h blog.body %></p> 
<% end %> 

<p>Comments: <%=h blog.comments %></p> 
+0

Это прекрасно работает. Благодаря! –

+0

В качестве небольшой вариации этой темы вы можете использовать «content_tag» (либо в помощнике, либо в представлении) для удаления встроенного HTML, как в чем-то вроде: content_tag (: p, "% s:% s" % [label, value]), если value.blank? – NeilS

+0

Я не знал, что content_tag можно использовать так. Благодарю. Как насчет внедрения sql. Я предполагаю, что использование% s вместо метки или значения позаботится об этом. –

0
show_field_unless_empty(blog, :body, 'Body') 

затем, в blog_helper.rb

def show_field_unless_empty(model, field, title) 
    render :partial => 'field', :locals => {:value => model.send(field), :title => title} if model.send(field) 
end 

затем, в _field.html.erb

<p> 
<%= title %>: 
<%= value %> 
</p> 

Это кажется довольно чисто для меня.

+0

Извините, на самом деле это не работает. Это дает мне то же значение, что и раньше. –

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