2012-01-11 9 views
11

は、私はルビーの研究や書籍のいずれもが大量にやりました私はこの "偽りの"文法をここで取り上げて読んだ。私はレールの文法でそれの言及を見つけることができない、誰かがこれをクリアするリンクや説明を提供することができますか?レール/ルビー「とfalseを返す」構文

ルビは常に最後に評価された式を返すと思ったので、ここでは「と」の必要性を理解していません。

+0

ああ、私はあなたが*なぜそれが使われるのかと尋ねていると思った。いずれにしても、私の答えに記述されているようにフィルタによって使用されている場合は、非常に注意してください。 –

答えて

21

は、前の文と同じ行で偽リターンを書くことができるようにするだけのためにそこにあります。

それがこれを行うのと同等です:

redirect_to login_path, :notice => "Please log in to continue" 
return false 

redirect_to方法はゼロではない何かを返した場合「と」それだけでfalseを返すだろうとするので、それはまったく同じではありません偽がほとんど常に返されますが、の場合はでもでも偽の場合の場合は、右側が常に実行されます(falseが返されます)。 Rubyで

& &にだけエイリアスで、唯一の違いはまさにそれのように振る舞い、それは文のすべての他の部分よりも低い優先順位を持っているので、まずそれには何でも評価します左に移動してから適用されます。 Rubyのまたはと同じです。ですが、式の優先順位は低くなります。

+1

常に実行するリターンを追加したいが、最初の式が常にfalse以外の値を返すことはない** ** do_somethingのように 'と'の代わりにセミコロンを使うこともできる**引数、引数;偽を返す –

2

フィルタの戻り値が予想されたときに、この種類の構造体をフィルタとともに使用しました。 falseは、通常の要求処理を停止します。だから、

コントローラは、このように見えた場合:コントローラのアクションの

class FooController < ActionController::Base 
    before_filter :access_denied 
    # etc. 
end 

いずれも実行しないでしょう。

def check_access 
    return access_denied unless current_user.has_access 
end 

このごろフィルタの戻り値は無視されます。この方法は、おそらくのように、フィルタからと呼ばれるように設計されました。

これは、アクションの処理を停止し、リダイレクト後に戻るためのアクションで通常の方法として使用することができるので、他のロジック/レンダリング/ etc。コントローラーの内部で実行されます。

3

redirect_to login_path, :notice => "Please log in to continue"は(source codeを参照、またはゼロ)がfalseを返さないRubyで通常発現ので、プログラムの実行を継続する(AND後の第2の部分を確認する)とreturn falseを実行することができます。オペレーターの

1

ドキュメント:そのうちの一つがnilまたはfalseを返すまでandを使用してUnder the "Defined?, And, Or, and Not" section

が一緒に関連する操作をチェーンするのに便利です。あなたはあなたの質問に示したようにそれを使うことができますし、またそれを使ってコード行を短絡することもできます。

# Short circuit example 
blog = Blog.find_by_id(id) and blog.publish! 

find_by_idが成功した場合のみ、.publish!がそれに呼び出されるブログ。あなたの例では

:彼らはちょうどよりコンパクトに1行のコードを書くためにそれを使用している

def access_denied 
    redirect_to login_path, :notice => "Please log in to continue" and return false 
end 

def show 
    if something 
    render :partial => 'some_partial' 
    end 

    render :partial => 'some_other_partial' 
end 

Railsはあなたに警告を与える:

しかし、それはまた、あなたが条件文に基づいてレンダリングすることができるコントローラのアクションのために有用であり、あなたがRailsのを取得する必要はありません警告「複数のレンダリング」 somethingは、アクション内で複数のレンダリングステートメントが評価されているため、trueを返します。ただし、変更した場合は、

if something 
    render :partial => 'some_partial' and return 
end 

に変更した場合、アクションの実行を停止できます。