2013-10-04 2 views
0

Мне очень нравится тернарный оператор. Он действительно очищает внешний вид кода, но у меня есть случай, когда он не будет корректно вести себя в контроллере Rails.Почему троянный оператор не работает с перенаправлением

я получаю ошибку синтаксиса: unexpected tSYMBEG, expecting keyword_do or '{' or '('

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

Я не знаю об этом правила?

if nexti==0 then 
    redirect_to :back 
else 
    redirect_to edit_playt_path(id: actform['playt_id'], i: nexti) 
end 

nexti==0 ? redirect_to :back : redirect_to edit_playt_path(id: actform['playt_id'], i: nexti) 
+0

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

ответ

1

Из-за предположительного характера хэш

Руби/Rails будет подразумевают, что ваш аргумент перенаправления - это хэш, который имеет некоторые неудобные последствия в вашем примере.

Когда рубин подразумевает аргументы для перенаправления его эс его как хэш в следующем сценарии это разборе как

nexti==0 ? redirect_to({:back, : redirect_to edit_playt_path(id: actform['playt_id'], i: nexti}) 

который является недействительным, он должен работать, если вы явно определить ваш хэш/аргумент

nexti==0 ? redirect_to(:back) : redirect_to(edit_playt_path({id: actform['playt_id'], i: nexti})) 

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

return redirect_to(:back) if nexti==0 
redirect_to(edit_playt_path({id: actform['playt_id'], i: nexti})) 
0

Вы должны использовать круглые скобки в вызове к redirect_to поэтому анализатор может правильно понять, что происходит:

nexti==0 ? redirect_to(:back) : redirect_to(edit_playt_path(id: actform['playt_id'], i: nexti)) 
Смежные вопросы