红宝石一行“检查价值和返回”

时间:2010-03-24 14:32:10

标签: ruby-on-rails ruby

我正在挖掘一些有趣的代码,我确信这是错误的。我想知道是否有人想过开发人员试图使用的语法?

Heres'伪造的代码:

render :nothing => true and return if params[:name].nil?

我的天真修正暗示了我的编程语言背景:

if params[:name].nil?
  render :nothing => true, :status => 404
  return
end

是否有更优雅,更像红宝石的方式? (分号不算:)

5 个答案:

答案 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