#ruby #if-statement
#ruby #if-оператор
Вопрос:
Я новичок в Ruby, и я сомневаюсь в правильном написании этой части:
<% if session[:user_id].nil? || (params[:controller] != 'home' amp;amp; params[:action] != 'index') %>
something
<% else %>
something else
<% end %>
Но первая часть конструкции IF неверна (особенно часть параметров). Если бы я попробовал это:
<% if params[:controller] != 'home' amp;amp; params[:action] != 'index' %>
Итак, я получил плохие результаты, но если это:
<% unless params[:controller] == 'home' amp;amp; params[:action] == 'index' %>
Итак, теперь я получил уже хорошие результаты…
Где может быть проблема? Что может быть неправильным? Первый код — это то, что мне нужно, но я не знаю, как объединить все….
Комментарии:
1. Если вы задаете вопрос о Ruby, а не о Rails, вам это не нужно
<%
.
Ответ №1:
A != B AND C != D
это НЕ то же самое, что !(A == B AND C == D)
Первый имеет значение true только тогда, когда ОБЕ пары различны. Второе значение истинно, если ЛЮБАЯ пара отличается. В вашем примере, чтобы преобразовать unless в if, вы бы сделали:
<% if params[:controller] != 'home' || params[:action] != 'index' %>
Так что условие истинно, если ОНИ не совпадают.
Прочитайте об этом здесь http://en.wikipedia.org/wiki/Logical_connective
Ответ №2:
Если это работает для вас:
<% unless params[:controller] == 'home' amp;amp; params[:action] == 'index' %>
Эквивалент с if
будет:
<% if !(params[:controller] == 'home' amp;amp; params[:action] == 'index') %>
И, передавая это отрицание внутри, вы получаете:
<% if params[:controller] != 'home' || params[:action] != 'index' %>
Обратите внимание, как не только ==
становится !=
, но и amp;amp;
становится ||