我正在挖掘一些有趣的代码,我确信这是错误的。我想知道是否有人想过开发人员试图使用的语法?
Heres'伪造的代码:
render :nothing => true and return if params[:name].nil?
我的天真修正暗示了我的编程语言背景:
if params[:name].nil?
render :nothing => true, :status => 404
return
end
是否有更优雅,更像红宝石的方式? (分号不算:)
答案 0 :(得分:12)
因为在Ruby Operator Precedence中,if
的优先级低于and
,所以它的工作方式与它的读取完全相同,实际上在我见过的很多rails代码中都很常见。
答案 1 :(得分:5)
简单:
return render(:nothing => true) unless params[:name]
但是,更好:
return render(:nothing => true) if params[:name].blank?
答案 2 :(得分:4)
正如jamuraa所说,“更优雅,更像红宝石的方式”是“虚假代码”。我认为在这种情况下添加parens使其更具可读性。
render(:nothing => true) and return if params[:name].nil?
答案 3 :(得分:1)
我看到有些人建议使用“渲染xxx并返回if ......”我强烈建议不要这样做。
渲染和重定向API并未声明它们应始终返回真值。我喜欢写这个是用这个成语:
(render 'xyz'; return) if condition?
(head :ok; return) unless record.invalid?
您也可以在Ruby bug的跟踪器上找到关于此问题的一些讨论:https://bugs.ruby-lang.org/issues/6201
答案 4 :(得分:0)
老问题,但我想我会提供一些背景知道为什么这条线出现以防有人遇到它。这根本不是假的;包含“和return”以防止DoubleRenderError非常重要。从ActionController :: Base文档:
如果你需要重定向某事的条件,那么一定要 添加“并返回”以停止执行。
def do_something
redirect_to(:action => "elsewhere") and return if monkeys.nil?
render :action => "overthere" # won't be called if monkeys is nil
end