2016-08-30 11 views
1

私はマイケル・ハートルによってruby on railsチュートリアル以下だとcondintionあれば、彼は内部の代入演算子を使用していますどのように私は取得しない:ルビーon Railsのチュートリアルであれば(USER_ID =セッション[:user_idを])

if (user_id = session[:user_id]) 
     @current_user ||= User.find_by(id: user_id) 
end 

ことができる誰かしてくださいその背後にある論理を説明してください。

答えて

5

これはRubyでシンタックスシュガーの一つです:あなたは、これは、これを行うと等価である@current_user = @current_user || User.find_by(id: user_id)

+0

全く同じではありません。最初の例では、user_idのスコープはifの本体です。後者では、user_idはifの後にも定義されます。 – Ursus

+0

@Ursus:間違っています。それをirbで試してみてください。 'if'はRubyのスコープゲートではありません。新しいスコープは、クラス、モジュール、またはメソッドを定義するたびに作成されます。スコープゲートのセクションの詳細はこちらhttp://hopsoft.github.io/blog/ruby-metaprogramming-idioms/ – kiddorails

+0

私は答えの前にirbを試しました。うーん。 – Ursus

4

割り当てが式であるため、ifステートメントで代入演算子を使用することはできます。代入式の結果は、代入式の値です。 session[:user_id]nilfalseない場合は、この場合には

は、ifブランチの結果が呼び出され、user_idsession[:user_id]の結果に設定されます。 session[:user_id]nilまたはfalseの場合は、user_idに割り当てられますが、ifのロジックは評価されません。

0

これは代入演算子が言うことだと思います...これは、@ current_userの値がnullの場合、その値をuser_idに設定するということです。それ以外の場合は、@ current_user値を保持します。

user_id = session[:user_id] 
if user_id 
    @current_user ||= User.find_by(id: user_id) 
end 
1

としてそれを読むことができます。

Rubyはあなたが条件文で変数を割り当てることができますし、

user_id = session[:user_id] 
if user_id 
    @current_user ||= User.find_by(id: user_id) 
end 

x = true #=> returns true

if (user_id = session[:user_id]) 
    @current_user ||= User.find_by(id: user_id) 
end 

が同等である値を返しますあなたの行を保存します。 session[:user_id]が偽である場合、偽の値をuser_idに割り当て、ブロックを実行しません。

関連する問題