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/
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)
这样,您就不必创建用户实例来对其进行身份验证.