1

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

2 回答 2

2

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

nexti==0 ? redirect_to(:back) : redirect_to(edit_playt_path(id: actform['playt_id'], i: nexti))
于 2013-10-04T21:41:17.363 回答
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 开发人员会因为这样的原因告诉你避免使用三元组,以及人类对正在发生的事情的一般理解。Ruby 被认为是一种表达性语言,所以接受它。

return redirect_to(:back) if nexti==0
redirect_to(edit_playt_path({id: actform['playt_id'], i: nexti}))
于 2013-10-04T21:41:25.147 回答