2015-10-23 2 views
1

В моем приложении Rails 4 есть модель Post, имеющая как :copy, так и атрибут :short_copy.Rails 4: условный дисплей не работает внутри вид

В сообщениях # Показать представление, я хочу показать :short_copy, если он был определен пользователем, и :copy в противном случае.

Итак, я осуществил следующий код:

<% if @post.short_copy %> 
    <%= @post.short_copy %> 
<% else %> 
    <%= @post.copy %> 
<% end %> 

Проблема: когда :short_copy определен, он появляется, однако, когда он не определен (и :copyявляется определено), то :copy не отображается.

С кодом что-то не так?

+0

Возможно ли, что @ post.short_copy равно пустой строке? –

+0

Да, это было бы возможно, вы правы. И тогда, если '@ post.short_copy' не ноль, значит, мы показываем его, и ничего не появляется. Итак, мне нужно проверить, что он делает что-то вроде 'if @ post.short_copy.nil? || @ post.short_copy.empty? 'например? –

+0

Да. В точку. Я бы сделал '@ post.short_copy.nil?', Но тогда вам нужно будет убедиться, что ваш пользовательский ввод сохраняет правильно или 'nil'. :) –

ответ

3

Использование String#blank? для проверки значения - пустая строка еще true

<% if [email protected]_copy.blank? %> 
    <%= @post.short_copy %> 
<% else %> 
    <%= @post.copy %> 
<% end %> 
+3

'@ post.short_copy.present?' Также будет работать, если вы предпочитаете не использовать '!' В выражении. –

2

Я бы сказал, что в вашем коде нет ничего плохого, но вы можете ввести в заблуждение значение @ post.short_copy. Если не будет nil или false, то будет запущен <% if @post.short_copy %>. Я бы предположил, что @post.short_copy = '', и поэтому ничего не отображает в представлении.

1

Я просто запустить этот фрагмент кода:

2.1.1 :002 > if("") 
2.1.1 :003?> printf "yes" 
2.1.1 :004?> else 
2.1.1 :005 >  printf "no" 
2.1.1 :006?> end 
(irb):6: warning: string literal in condition 
yes => nil 

Так что - если short_copy пустая строка, то она будет вычисляться правда. Так что попробуйте это:

2.1.1 :020 > unless("".empty?) 
2.1.1 :021?> printf "yes" 
2.1.1 :022?> else 
2.1.1 :023 >  printf "no" 
2.1.1 :024?> end 
no => nil 
1

Я всегда использую string.blank?, чтобы проверить, если ноль или пустая строка. Используйте поле array.empty?, если поле является массивом. Итак, в вашем случае вы можете использовать пробел?

<% unless @post.short_copy.blank? %> <%= @post.short_copy %> <% else %> <%= @post.copy %> <% end %>

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