Undefined method `authenticate'

Witam

Dopiero zaczynam moja przygode w ROR, wczesniej programowalem w PHP i przyszedl czas na przepisanie modulu autentykacji/autoryzacji.
Mam nastepujacy kontroller:

[code]class AuthController < ApplicationController

before_filter :login_required, :only=>[‘change_password’, ‘hidden’]

def signup
@user = User.new(params[:user])
if request.post?
if @user.save
session[:user] = User.authenticate(@user.login, @user.password)
flash[:message] = “Rejestracja przebiegła pomyślnie!”
redirect_to :action => “welcome”
else
flash[:warning] = “Wystąpił błąd podczas rejestracji!”
end
end
end
end[/code]
i nastepujacy model:

[code]require ‘digest/sha1’

class User < ActiveRecord::Base
validates_length_of :login, :maximum => 40
validates_length_of :password, :minimum => 5
validates_presence_of :login, :email, :password, :password_confirmation
validates_uniqueness_of :login, :email
validates_confirmation_of :password
validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})$/i, :message => ‘Wprowadzony adres email jest niepoprawny!’

attr_protected :id, :salt

ER_USER_NOT_EXISTS = 0
ER_BAD_PASSWORD = -1

def password=(pass)
@password=pass
self.salt = TextHelper.random_string(10) if !self.salt?
self.hashed_password = self.encrypt(@password, self.salt)
self.unique_hash = self.create_hash
end

def password
return @password
end

def encrypt(pass, salt)
return Digest::SHA1.hexdigest(pass + salt)
end

def authenticate(login, pass)
u = self.find(:first, :conditions => [‘login = ?’, login])
if u.nil?
return ER_USER_NOT_EXISTS
end
if self.encrypt(pass, u.salt) == u.hashed_password
return u
else
return ER_BAD_PASSWORD
end
nil
end

def create_hash
while 1
hash = TextHelper.random_string(40)
if !User.find(:first, :conditions => [‘unique_hash = ?’, hash])
return hash
end
end
end

end[/code]
po poprawnym wypelnieniu formularza ROR wywala mi nastepujacy blad:

[quote]NoMethodError in AuthController#signup
undefined method `authenticate’ for #Class:0xb6e99970[/quote]
Co robie nie tak? Czy to jest wina tego, ze nie utworzylem wczesniej obiektu User?

Jeśli używasz metody na obiekcie klasy, tak jak tutaj: User.authenticate(@user.login, @user.password)
to metodę tę musisz zdefiniować jako metodę klasy, a nie instancji:

[code=ruby]# Ta będzie użyta przy: @user.authenticate
def authenticate
puts puts “#{self.inspect} #{caller(0).first}”
end

A ta będzie użyta przy: User.authenticate, i tej właśnie potrzebujesz.

def self.authenticate
puts puts “#{self.inspect} #{caller(0).first}”
end[/code]
Są tez inne możliwości definiowania metod klasy, np.[code=ruby]class User
class << self
def auth
puts “#{self.inspect} #{caller(0).first}”
end
end

…albo:

def self.auth
puts “#{self.inspect} #{caller(0).first}”
end
end

…czy też:

def User.auth
puts “#{self.inspect} #{caller(0).first}”
end[/code]

dzieki wielkie