2016-09-01 6 views
1

Ruby on RubyとRuby on Railsの新機能です.Cのような言語を背景にしています。ここでRuby on Railsのクラス変数とメソッドの理解

def current_user 
    @current_user ||= Renter.find(session[:user_id]) if session[:user_id] 
end 
helper_method :current_user 

def authorize_user 
    redirect_to '/login' unless current_user 
end 

は、私はそれについて理解していないものです: - ライン4日、:current_usercurrent_userインスタンスメソッドを呼び出すか、直接アクセスしている
ここ
は、私がapplication_controller.rbファイルで見つかったいくつかのコードです@current_userインスタンス変数?
- current_userインスタンスメソッドを呼び出すcurrent_user、または@current_userインスタンス変数に直接アクセスしていますか?
- 2行目では、変数が:user_idか、キーとして使用される文字列リテラルによく似ていますか? JavaScriptのようなものは、sessionオブジェクトのuser_idプロパティを取得するためにsession["user_id"]と書くかもしれません。

答えて

2

この例では、クラスメソッドは関連しません。ここでは使用されていません。

インスタンス変数は、取得/設定時に決してメソッドを呼び出しません。

逆も時々起こりますが。インスタンス変数のgetter/setterメソッドを作成するのは非常に一般的なパターンなので、attrのリーダ/ライター/アクセサヘルパーはRubyコアで定義されています。 attr_accessor :fooと書くと、foo=fooはインスタンス変数を取得/設定します。

しかし、これはデフォルトでは発生しません。

あなたの他の質問に答えるために:コロンで始まり、文字列に似て:user_id

シンボルを。シンボルと文字列の違いは恣意的に見えるかもしれませんが、Rubyでは重要な概念であり、頭の中での区別は良い考えです。あなたのコメントに応答する


ライン4、helper_method :current_userは、あなたが好きならば、「レールの魔法」を検討し、実際にレールに固有のものです。実際には、これはあなたのcurrent_userメソッドをビューから呼び出せるようにしています(デフォルトでは、コントローラ内でのみ利用可能です)。 :current_userは、current_userメソッドを参照するために使用されるシンボルです。必ずしも完全に理解しなければならないものではなく、helper_methodがメソッドと同じ名前のシンボルを取り、そのメソッドをビューで使用できるようにすることは十分です。私が知る限り、それはRailsコントローラにのみ関係します。

Rubyでは、メソッド名を参照するシンボルを使用するのが一般的です。より中間的な概念です。あなたはsendに別の例を見ることができます:

def asd 
    return 0 
end 

class Foo 
    def instance_method_bar 
    return 0 
    end 
    def self.class_method_bar 
    return 0 
    end 
end 

# how the methods are typically called 
asd 
Foo.new.instance_method_bar 
Foo.class_method_bar 

# another way to call them, using send 
send(:asd) 
Foo.new.send(:instance_method_bar) 
Foo.send(:class_method_bar) 

私はあなたがする必要がある場合を除き、あなたがsendを使用して推薦していないんだけど、うまくいけば、それはシンボル:current_userhelper_method

ラインで使用されているか、それがより明確になります図7は、current_userメソッドが呼び出されたことを示しています。

+0

4行目の ':current_user'と7行目の' current_user'は何を参照していますか? ':current_user'もシンボルですか? – AjaxLeung

+0

@AjaxLeung updated answer –

+0

かなり徹底したルビーの教科書を読むことをお勧めします(例は必要ありません、概念を理解するだけです)。これをしなくてもRailsを学ぶことはできませんでしたが、確かにRubyを理解することは、Railsをデバッグしたり、「魔法」を解体するときに便利です。 –

1

一度に1つの質問に取り組みましょう。 4行目で

  • :current_userは、最も可能性の高いcurrent_user返すために使用する方法であるので、あなたはusername、またはemail、あるいはどのような値ユーザーが持っているにアクセスすることができます。

  • オンラインでも同じ方法です。この場合、Rubyはcurrent_userオブジェクトが存在するかどうかをチェックしています。 unlessif notと考えることができます。したがって、current_userがfalseの場合、コードはログインにリダイレクトされます。current_user == nilの場合に発生します。ユーザーがログインしている場合、current_user != nil、リダイレクトは発生しません。ライン2上

  • :user_idはシンボルであり、sessionのようなキーと値のペアであり、ハッシュ、ある{1、B:2}、あなたは[]を使用して、キーと値にアクセスメソッドであるため、session[:user_id]はuser_idの値を返しています。 Rubyではキーは何でも使用できますが、シンボルは常に一意であるため使用され、オブジェクトIDは:two:twoは同じですが、IDは「2」と「2」では異なります。

+0

1.なぜ4行目と7行目のメソッド呼び出しが異なって見えるのですか(1つは前にコロンがあり、もう1つはそうではありません)。 2.:current_userはシンボルの宣言ですか? 3.シンボルは文字列のようなプリミティブなのですか、それとも変数のような値を保持していますか? – AjaxLeung

+0

あなたは ':current_user'を引数として考えることができます。これは' helper_method'にどのメソッドを呼び出すかを伝えているので、より多くの識別子です。コロンのない 'current_user'は、実際にメソッド自体を呼び出しています。 – davidhu2000

関連する問題