2010-03-24 49 views
4

我正在挖掘一些我相信錯誤的有趣代碼。我想知道是否有人想過開發人員嘗試使用的語法?紅寶石一行「檢查數值並返回」

繼承人的虛假代碼:

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

我天真修復暗示我的編程語言背景:

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

有沒有更優雅,更紅寶石樣的方式? (分號不計數:)

+0

是什麼讓這個假的代碼?你是否確信它錯了,或者它實際上是在造成一個錯誤? 我喜歡它像自然語言一樣閱讀的方式。 – Ben 2010-03-24 14:39:19

回答

5

簡單:

return render(:nothing => true) unless params[:name] 

但是,更好:

return render(:nothing => true) if params[:name].blank? 
12

因爲在Ruby Operator Precedence中,if的優先級低於and,所以它的讀取效果完全正常,實際上在我看到的很多rails代碼中都很常見。

4

正如jamuraa所說,「更優雅,更紅寶石般的方式」就是「僞代碼」。我認爲在這種情況下添加parens使其更具可讀性。

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

老問題,但我想我會提供,爲什麼這條線將出現在以防其他人的一些背景遇到它。這根本不是假的;包含「和返回」以防止出現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 
1

我看到一些人建議用「渲染XXX,如果返回......」,我會強烈反對這種做法。

渲染和重定向API沒有聲明它們應該總是返回一個真值。我寫這首是用這個成語:

(render 'xyz'; return) if condition? 
(head :ok; return) unless record.invalid? 

您可以找到也紅寶石錯誤的跟蹤這個一些討論:https://bugs.ruby-lang.org/issues/6201