5

私はいくつかのレールを練習しているレールキャストで、理解しようとしているものを見つけました。Ruby on Railsで自己は何をしますか?

認証メソッドの「自己」が何をしているのか分かりませんでした。だから私はそれを削除し、それがエラーを示すだろうかどうかを確認するために私のアプリのログインをテストし、それがやった:誰かがその「自己」をやっている正確に何を説明することができれば、私は本当に感謝

error: 

**NoMethodError in SessionsController#create 
undefined method `authenticate' for #<Class:0x00000102cb9000**> 

。私は何が起こっていたのか正確に把握しようとしていましたが、私の周りに頭を浮かべることはできません。

メソッドはモデルで定義されており、sessions_controllerで呼び出されます。 私は自分のアプリを削除し続けていますが、ハングアップするために最初から始めています。 "自己"で立ち往生した。

私は、何かがうまくいかない理由を理解するのが好きな人のタイプです。

コントローラ:

def create 
    user = User.authenticate(params[:email], params[:password]) 
    if user 
     session[:user_id] = user.id 
     redirect_to root_path, :notice => "Logged In" 
    else 
     flash.now.alert = "Invalid credentials" 
     render "new" 
    end 
    end 

モデル:

def self.authenticate(email, password) 
     user = find_by_email(email) 
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt) 
     user 
    else 
     nil 
    end 
    end 

答えて

13

これは基本的なルビーの質問です。この場合、クラスメソッドを定義するためにselfが使用されます。このように使用されている

class MyClass 
     def instance_method 
     puts "instance method" 
     end 

     def self.class_method 
     puts "class method" 
     end 
    end 

instance = MyClass.new 
    instance.instance_method 

または:少し物事をクリアし

MyClass.class_method 

希望。また、参照してください:完了のためにhttp://railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/

+1

あなたの答えにわずかな拡張子があります: 'def object.my_foo_method'。 'obj'に' my_foo_method'を定義します。答えの文脈では、 'self'は' Class'クラスのオブジェクト(つまりクラス 'MyClass')です。したがって、そのクラスのメソッドを定義します。 – Swanand

+0

インスタンスに「@」記号を使用しないでください。 @インスタンス= ...? –

+0

はそれがレールであり、それはおそらくビューで使用されるでしょう –

2
class User 
    def self.xxx 
    end 
end 

class User  
    def xxx 
    end 
end 

がインスタンスメソッドを定義する一方、クラスのメソッドを定義する1つの方法です。

自分を削除した場合。あなたはクラスではなく、クラスのインスタンスのメソッドを呼び出そうとしているので、あなたが

User.authenticate 

を行う際にデフから、あなたは方法が見つからないエラーが発生します。インスタンスメソッドを使用するには、クラスのインスタンスが必要です。

4

selfは、クラスのインスタンスの代わりに、クラスのメソッドを定義しています。だから、def self.authenticateであなたは次の操作を行うことができます。

u = User.authenticate('[email protected]','[email protected]') 

の代わりにやって...

u = User.new 
u.authenticate('[email protected]','[email protected]') 

そのように、あなたは1を認証するために、ユーザーのインスタンスを作成する必要はありません。

+0

メソッドを使用するためにクラスをインスタンス化する必要性を回避する以外に、インスタンスメソッドではなくクラスメソッドを定義する他の理由がありますか? – LazerSharks

3

と将来の頭痛を阻止するために、私はまた、2が等価であることを指摘したいと思います:好みの

class User 
    def self.authenticate 
    end 
end 

class User 
    def User.authenticate 
    end 
end 

事項。

関連する問題