2013-10-04 38 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

由于哈希

的Ruby/Rails的暗示性会暗示你的论点重定向是一个散列,在你的例子中有一些尴尬的含义

当ruby意味着重定向它的参数se上课它在以下情况下它散列解析它作为

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开发者都会告诉你因为这样的原因避开三元论,并且也理解一般人对事情的理解。 Ruby渴望成为一种富有表现力的语言,所以拥抱它。

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)) 
相关问题