は、私はルビーの研究や書籍のいずれもが大量にやりました私はこの "偽りの"文法をここで取り上げて読んだ。私はレールの文法でそれの言及を見つけることができない、誰かがこれをクリアするリンクや説明を提供することができますか?レール/ルビー「とfalseを返す」構文
ルビは常に最後に評価された式を返すと思ったので、ここでは「と」の必要性を理解していません。
は、私はルビーの研究や書籍のいずれもが大量にやりました私はこの "偽りの"文法をここで取り上げて読んだ。私はレールの文法でそれの言及を見つけることができない、誰かがこれをクリアするリンクや説明を提供することができますか?レール/ルビー「とfalseを返す」構文
ルビは常に最後に評価された式を返すと思ったので、ここでは「と」の必要性を理解していません。
とは、前の文と同じ行で偽リターンを書くことができるようにするだけのためにそこにあります。
それがこれを行うのと同等です:
redirect_to login_path, :notice => "Please log in to continue"
return false
redirect_to方法はゼロかではない何かを返した場合「と」それだけでfalseを返すだろうとするので、それはまったく同じではありません偽がほとんど常に返されますが、の場合はでもでも偽の場合の場合は、右側が常に実行されます(falseが返されます)。 Rubyで
と& &にだけエイリアスで、唯一の違いはまさにそれのように振る舞い、それは文のすべての他の部分よりも低い優先順位を持っているので、まずそれには何でも評価します左に移動してから適用されます。 Rubyのまたはもと同じです。ですが、式の優先順位は低くなります。
常に実行するリターンを追加したいが、最初の式が常にfalse以外の値を返すことはない** ** do_somethingのように 'と'の代わりにセミコロンを使うこともできる**引数、引数;偽を返す –
フィルタの戻り値が予想されたときに、この種類の構造体をフィルタとともに使用しました。 false
は、通常の要求処理を停止します。だから、
コントローラは、このように見えた場合:コントローラのアクションの
class FooController < ActionController::Base
before_filter :access_denied
# etc.
end
いずれも実行しないでしょう。
def check_access
return access_denied unless current_user.has_access
end
このごろフィルタの戻り値は無視されます。この方法は、おそらくのように、フィルタからと呼ばれるように設計されました。
これは、アクションの処理を停止し、リダイレクト後に戻るためのアクションで通常の方法として使用することができるので、他のロジック/レンダリング/ etc。コントローラーの内部で実行されます。
redirect_to login_path, :notice => "Please log in to continue"
は(source codeを参照、またはゼロ)がfalseを返さないRubyで通常発現ので、プログラムの実行を継続する(AND後の第2の部分を確認する)とreturn false
を実行することができます。オペレーターの
ドキュメント:そのうちの一つが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
に変更した場合、アクションの実行を停止できます。
ああ、私はあなたが*なぜそれが使われるのかと尋ねていると思った。いずれにしても、私の答えに記述されているようにフィルタによって使用されている場合は、非常に注意してください。 –