Rails — Как выполнять инструкции If и else в текстовом поле

#ruby-on-rails #ruby #ruby-on-rails-3

#ruby-on-rails #ruby #ruby-on-rails-3

Вопрос:

Я пытаюсь выполнить инструкции if и else в этом текстовом поле со значением:

 <%= f.text_field :rating, :size => 1, :min => 1, :max => 6, :value => if vind.ratings == 0 else vind.rating_score/vind.ratings, :type => 'range', :step => '1', :id => "#{vind.id}" %>
  

Я получаю эту ошибку в поле зрения:

 SyntaxError in Kategoris#show

Showing C:/Rails/konkurranceportalen/app/views/kategoris/_rating.html.erb where line #3 raised:

C:/Rails/konkurranceportalen/app/views/kategoris/_rating.html.erb:3: syntax error, unexpected keyword_else, expecting keyword_then or ';' or 'n'
...ue => if vind.ratings == 0 else vind.rating_score/vind.ratin...
...                               ^
C:/Rails/konkurranceportalen/app/views/kategoris/_rating.html.erb:3: syntax error, unexpected ',', expecting ')'
...vind.rating_score/vind.ratings, :type => 'range', :step => '...
...                               ^
  

Ответ №1:

Обычно я использую сокращение, вот так:

 :value => ( vind.ratings == 0 ? 0 : vind.rating_score/vind.ratings )
  

Ответ №2:

 <%= f.text_field :rating, :size => 1, :min => 1, :max => 6, :value => (vind.ratings == 0) ? 0 : vind.rating_score/vind.ratings, :type => 'range', :step => '1', :id => "#{vind.id}" %>
  

В конечном итоге это выглядит следующим образом для :value .

  :value => (vind.ratings == 0) ? 0 : vind.rating_score/vind.ratings
  

Комментарии:

1. Это код ruby, но ruby работает и в rails. Rails был построен на ruby.

2. Почему я не могу написать, если vind.ratings == 0 else 1 end или :value => «#{<% if vind.ratings == 0 %><% else %><%= vind.ratings %>}»?

3. @tzown вы не можете написать это просто потому, что это недопустимый ruby-код

4. Во-первых, ваша логика неверна. Вы указываете, показывает ли vid.ratings == 0 {do_nothing} еще vind.ratings. Вы ничего не можете сделать в ruby. Это недопустимый код. Вам просто нужно будет выполнить if vind.ratings > 0, а затем показать vind.ratings.

5. @tzown, для дальнейшего использования то, что я использую, называется троичными операторами. en.wikipedia.org/wiki/Ternary_operation#Ruby

Ответ №3:

Я могу сделать вот так:

 <%= f.text_field :rating, :size => 1, :min => 1, :max => 6, :value => "#{if vind.ratings == 0 else vind.rating_score/vind.ratings, :type => 'range', :step => '1', :id => "#{vind.id}" %>
  

или как выше, но в ():

 <%= f.text_field :rating, :size => 1, :min => 1, :max => 6, :value => ((vind.ratings == 0) ? value_here : vind.rating_score/vind.ratings), :type => 'range', :step => '1', :id => "#{vind.id}" %>