为什么三元运算符不能使用重定向

时间:2013-10-04 21:35:04

标签: ruby-on-rails ruby syntax controller

我喜欢三元运算符。它确实清理了代码外观,但我有一种情况,它在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)

2 个答案:

答案 0 :(得分:2)

由于散列的隐含性质

Ruby / Rails意味着你的重定向参数是一个哈希,它在你的例子中有一些尴尬的含义

当ruby暗示重定向的参数时,它将其视为以下场景中的哈希,它将其解析为

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}))

大多数ruby / rails devs会告诉你出于这样的原因避免使用三元组,以及人们对正在发生的事情的一般理解。 Ruby是一种富有表现力的语言,所以接受它。

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

答案 1 :(得分:1)

您需要在调用redirect_to时使用括号,以便解析器能够正确理解正在发生的事情:

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