自制在轨道上的红宝石中做了什么?

Lon*_*Guy 6 ruby rubygems ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我正在铁路广播上练习一些铁轨,并且遇到了我想要了解的东西.

我没有得到验证方法中的"自我"所做的事情.所以我删除了它并测试了我的应用程序的登录,看它是否会显示错误,它确实:

error:

**NoMethodError in SessionsController#create
undefined method `authenticate' for #<Class:0x00000102cb9000**>
Run Code Online (Sandbox Code Playgroud)

如果有人能够准确解释"自我"正在做什么,我真的很感激.我试图弄清楚到底发生了什么,但无法理解它.

方法在模型中定义并在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
Run Code Online (Sandbox Code Playgroud)

模型:

 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
Run Code Online (Sandbox Code Playgroud)

rdv*_*ijk 13

这是一个基本的红宝石问题.在这种情况下,self用于定义类方法.

    class MyClass
      def instance_method
        puts "instance method"
      end

      def self.class_method
        puts "class method"
      end
    end
Run Code Online (Sandbox Code Playgroud)

使用方式如下:

    instance = MyClass.new
    instance.instance_method
Run Code Online (Sandbox Code Playgroud)

要么:

    MyClass.class_method
Run Code Online (Sandbox Code Playgroud)

希望能稍微清理一下.另请参阅:http://railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/


Ben*_*ger 5

self定义的方法而不是实例.所以def self.authenticate你可以做到以下几点:

u = User.authenticate('email@domain.com','p@ss')
Run Code Online (Sandbox Code Playgroud)

而不是......

u = User.new
u.authenticate('email@domain.com','p@ss')
Run Code Online (Sandbox Code Playgroud)

这样,您就不必创建用户实例来对其进行身份验证.