Authlogic - działa z wyjątkiem kombinacji: dobry email złe hasło

Cześć, mam problem z logowaniem.
Używam authlogic i wg. mnie ma wszystko dobrze ustawione: / szyfruje też e-mail, ale bez tego też się nie zmienia./

[code=“Ruby”]user.rb

acts_as_authentic do |c|
    c.login_field = :email_h 
end[/code]

[code=“Ruby”] user_session.rb

generalize_credentials_error_messages I18n.t('authlogic.error_messages.login_credentials_invalid')
def to_key
    new_record? ? nil : [ self.send(self.class.primary_key) ]
end[/code]

[code=“Ruby”]user_sessions_controller

def create
    tmpmail = params[:user_session][:email_h]
    params[:user_session][:email_h] = encrypt_email(params[:user_session][:email_h])
    @user_session = UserSession.new(params[:user_session])
    
    if  @user_session.save
        flash[:notice] = t('login.donelogin')
        redirect_to root_path, :format => params[:format]
    else
        @user_session.email_h = tmpmail
        render :action => 'new', :format => params[:format]
    end
end[/code]

Wszystkie kombinacje poza emailem i złym hasłem działają -tj. mogę podać złego emaila, brak hasła, poprawne email i hasło(normalnie się loguje).
Wysypuje się na

app/controllers/user_sessions_controller.rb:22:in `create'

czyli

if  @user_session.save

Teoretycznie bład:

[quote]You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.+[/quote]
Ale mam obiekt, robię zrzut do loga bezpośrednio przed wywołaniem tej metody:

logger.debug "@user_session: #{@user_session.inspect}\n\n" if @user_session.save
to dostaje w konsoli [quote]@user_session: #<UserSession: {:email_h=>“d5e86424b486756b0c22f42f84d8f131”, :password=>""}>[/quote]
Mi się już skończyły pomysły, macie jakiś?

Wygląda na to, że jeszcze nie oglądałeś odpowiedniego screencasta: http://railscasts.com/episodes/160-authlogic

(Wiem, ciągle rzucam linkami do Railscasts, ale dla początkujących to jest najlepsza droga.)

Dzięki za odpowiedź. Railscasty przejrzałem już dawno… :wink:
Doraźnie rozwiązałem problem wyjątkami, ale gdy relacje pomiędzy klasami przestały działać poświęciłem kolejne 2 dni na szukanie dlaczego znów coś nie działa… i całe szczęście udało się.

Popełniłem błąd przy dopisywaniu własnego rozwiązania do przeciążenia funkcji umożliwiającej używanie przecinków w liczbach dziesiętnych. (dodawałem(próbowałem) do tego kodu http://www.stjhimy.com/posts/11-using-comma-as-decimal-separator)

To jest brudny monkey patch.

Sugeruję zrobić podmianę przecinka na kropkę jako before_filter przetwarzający params - znacznie mniej intruzywne.

I nawet gotowy kod Ci zapodam:

[code=ruby] # application_controller.rb
before_filter :comma_to_dot_in_params

def comma_to_dot_in_params
  comma_to_dot( params )
end

def comma_to_dot( hash )
  hash.each do |key, value|
    if value.is_a?( Hash )
      comma_to_dot( value )
    elsif value =~ /(\s)*(\d)+,(\d)+(\s)*/  # only real numbers
      hash[key] = value.gsub( ",", "." )
    end
  end
end[/code]