Hi all,

Saya lagi belajar buat sistem autentikasi sederhana (masih nyontek buku
si..). Saya mengalami keanehan saat saya masukkan username dan password
dengan benar, saya masih gagal melewati autentikasi itu. Ini log server-nya:

Processing UsersController#login (for 127.0.0.1 at 2008-05-23 09:41:06)
[POST]
  Session ID: 36f8fd6ed5ef09c4384c100cd489e9ca
  Parameters: {"user"=>{"login"=>"dida", "password"=>"123"},
"commit"=>"Login", "action"=>"login", "controller"=>"users"}
  User Columns (0.001291)   SHOW FIELDS FROM users
  User Load (0.004381)   SELECT * FROM users WHERE (*users.`login` IS NULL*)
LIMIT 1
Rendering  within layouts/application
Rendering users/login
Completed in 0.04094 (24 reqs/sec) | Rendering: 0.00509 (12%) | DB: 0.00567
(13%) | 200 OK [http://localhost/login]

pertanyaan saya, kenapa query-nya "users.login IS NULL" padahal jelas2
parameter yang didapat dari method POST itu benar (sprt pd hash di atas).
Setelah penasaran, saya coba cek dengan console. Sebelumnya, mungkin ada
baiknya saya paste-kan beberapa source code di sini.

*Controller: users_controller.rb *
...
  def login
    if request.post?
      if user = User.authenticate(params[:login], params[:password])
        session[:user_id] = user.id
        redirect_to :controller => 'acaras', :action => 'index'
      else
        flash[:notice] = 'User/password anda salah'
      end
    end
  end
...

*Model: user.rb*
...
before_save :encrypt_new_password

  def self.authenticate(login, password)
    user = find_by_login(login)
    return user if user && user.authenticated?(password)
  end

  def authenticated?(password)
    hashed_password == encrypt(password)
  end


  protected
    def encrypt_new_password
      return if password.blank?
      self.hashed_password = encrypt(password)
    end

    def password_required?
      hashed_password.blank? || !password.blank?
    end

    def encrypt(string)
      Digest::SHA1.hexdigest(string)
    end

...

Saya coba dengan console menjalankan ini:

user2 = User.authenticate("dida", "123")
ActiveRecord::StatementInvalid: Mysql::Error: MySQL server has gone
away: *SELECT
* FROM users WHERE (users.`login` = 'dida')*  LIMIT 1
        from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract_adapter.rb:128:in
`log'
        from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:243:in
`execute'
        from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:399:in
`select'
        from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in
`select_all'
        from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:427:in
`find_by_sql'
        from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:997:in
`find_every'
        from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:991:in
`find_initial'
        from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1204:in
`send'
        from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1204:in
`method_missing'
        from
/usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/deprecation.rb:44:in
`silence'
        from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1204:in
`method_missing'
        from ./script/../config/../config/../app/models/user.rb:28:in
`authenticate'
        from (irb):10


Query-nya benar, tapi kok ada error "MySQL server has gone away"? Padahal
servis mysql-nya jalan lho.. Saya jadi menemukan masalah lain lagi (atau
inikah masalah sebenarnya? CMIIW).

Sebagai rangkuman, pertanyaan saya adalah:

1. Mengapa query pada server params[:login] nya tidak ada? (SELECT * FROM
users WHERE (*users.`login` IS NULL*))
2. Ada apa dengan error "MySQL server has gone away"?

Masih googling untuk cari jawaban pertanyaan kedua. Kalo yang pertama,
bingung cari dengan keyword apa.

Makasih sebelumnya,

Dida


[Non-text portions of this message have been removed]

Kirim email ke