2

アプリケーションの認証システムを構築しようとしています

ユーザーを登録するには、フォームに記入して送信し、user#signup を呼び出します

def signup  
    @user = User.new(params[:user])
    @user.password(params[:user][:password])
    @user.save 
end`

私のユーザーモデルには含まれています

def password(pass)
    @password=pass
    self.salt = User.random_string(10)
    self.hashed_password = User.encrypt(@password, self.salt)
end

デバッグしようとしたときに、@user ハッシュに何が含まれているかを確認しました。

  • @user = User.new(params[:user])ハッシュに空の「id」、「hashed_pa​​ssword」、および「salt」(およびタイムスタンプ) 以外のパラメーターが含まれた後

  • @user.password(params[:user][:password])ハッシュに「hashed_pa​​ssword」と「salt」の値が含まれるようになった後

  • @user.save が返す

    UsersController#signup の ArgumentError

    引数の数が間違っています (1 に対して 0)

スタックトレース

Started POST "/users/signup" for 127.0.0.1 at Fri Oct 05 14:23:49 +1000 2012
Processing by UsersController#signup as HTML
  Parameters: {"user"=>{"last_name"=>"last", "first_name"=>"first", "login"=>"myusername", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "email"=>"me@gmail.com", "dob(1i)"=>"1980", "dob(2i)"=>"4", "dob(3i)"=>"2"}, "authenticity_token"=>"R8/BNPox9F9rkUXZQ84xjnsplRjqLJYe35EtGjKEAWk=", "utf8"=>"✓", "commit"=>"Create User"}
   (0.1ms)  begin transaction
   (0.0ms)  rollback transaction
Completed 500 Internal Server Error in 10ms

ArgumentError (wrong number of arguments (0 for 1)):
  app/controllers/users_controller.rb:17:in `signup'
  app/controllers/users_controller.rb:16:in `signup'


  Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.1ms)
  Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.1ms)
  Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (7.8ms)

何か案が?

4

1 に答える 1

1

と呼ばれる列がpasswordあり、および/または を参照する検証があると思います:password

その場合の問題はpassword、暗黙的なゼロ パラメータの getter をpassword(pass)1 パラメータの setter でオーバーライドしたことです。代わりにセッターを に移動しpassword=、常に nil を返すゲッターを作成する必要があります。

def password
  nil
end

def password=(pass)
  @password = pass
  self.salt = User.random_string(10)
  self.hashed_password = User.encrypt(@password, self.salt)
end

User.new(:password => 'xyz')おまけとして、これは明示的なパスワード設定呼び出しをなくすことができることを意味しますpassword=

于 2012-10-05T04:58:48.397 に答える