2011-05-03 114 views
2

我剛剛學習RoR並遇到了我的第一個真正的bug。真的很感謝它的一些指導。我正在爲我正在構建的網站創建用戶登錄/註銷功能,這些功能將通過會話進行維護。當表單中的登錄提交給會話控制器時,會調用'create'方法。這樣做時它會顯示這個錯誤:Ruby on Rails中的NoMethodError從控制器調用Class方法

NoMethodError in SessionsController#create

You have a nil object when you didn't expect it! You might have expected an instance of ActiveRecord::Base. The error occurred while evaluating nil.[]

下面是創建方法的代碼:

33 def create 
    34 user = User.authenticate(params[:session][:email], 
    35       params[:session][:password]) 
    36 if user.nil? 
    37  flash.now[:error] = "Invalid email/password combination." 
    38  @title = "Sign in" 
    39  render 'new' 
    40 else 
    41  sign_in user 
    42  redirect_back_or user 
    43 end 
    44 end 

應用程序跟蹤說,錯誤是在

應用程序/控制器/ sessions_controller.rb :34:在'創建'

所以這個問題似乎與驗證方法。這是爲我的用戶對象定義的類方法。有什麼奇怪的是,我在rails控制檯中測試了這個方法,它工作正常。以下是完整的跟蹤。再次將非常感謝一些幫助。謝謝。

跟蹤:

app/controllers/sessions_controller.rb:34:in create' actionpack (3.0.4) lib/action_controller/metal/implicit_render.rb:4:in send_action' actionpack (3.0.4) lib/abstract_controller/base.rb:150:in process_action' actionpack (3.0.4) lib/action_controller/metal/rendering.rb:11:in process_action' actionpack (3.0.4) lib/abstract_controller/callbacks.rb:18:in block in process_action' activesupport (3.0.4) lib/active_support/callbacks.rb:435:in run_4224187041876590211__process_action_3718750575726612430_callbacks' activesupport (3.0.4) lib/active_support/callbacks.rb:409:in _run_process_action_callbacks' activesupport (3.0.4) lib/active_support/callbacks.rb:93:in run_callbacks' actionpack (3.0.4) lib/abstract_controller/callbacks.rb:17:in process_action' actionpack (3.0.4) lib/action_controller/metal/instrumentation.rb:30:in block in process_action' activesupport (3.0.4) lib/active_support/notifications.rb:52:in block in instrument' activesupport (3.0.4) lib/active_support/notifications/instrumenter.rb:21:in instrument' activesupport (3.0.4) lib/active_support/notifications.rb:52:in instrument' actionpack (3.0.4) lib/action_controller/metal/instrumentation.rb:29:in process_action' actionpack (3.0.4) lib/action_controller/metal/rescue.rb:17:in process_action' actionpack (3.0.4) lib/abstract_controller/base.rb:119:in process' actionpack (3.0.4) lib/abstract_controller/rendering.rb:41:in process' actionpack (3.0.4) lib/action_controller/metal.rb:138:in dispatch' actionpack (3.0.4) lib/action_controller/metal/rack_delegation.rb:14:in dispatch' actionpack (3.0.4) lib/action_controller/metal.rb:178:in block in action' actionpack (3.0.4) lib/action_dispatch/routing/route_set.rb:62:in call' actionpack (3.0.4) lib/action_dispatch/routing/route_set.rb:62:in dispatch' actionpack (3.0.4) lib/action_dispatch/routing/route_set.rb:27:in call' rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in block in call' rack-mount (0.6.14) lib/rack/mount/code_generation.rb:93:in block in recognize' rack-mount (0.6.14) lib/rack/mount/code_generation.rb:68:in optimized_each' rack-mount (0.6.14) lib/rack/mount/code_generation.rb:92:in recognize' rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in call' actionpack (3.0.4) lib/action_dispatch/routing/route_set.rb:492:in call' actionpack (3.0.4) lib/action_dispatch/middleware/best_standards_support.rb:17:in call' actionpack (3.0.4) lib/action_dispatch/middleware/head.rb:14:in call' rack (1.2.2) lib/rack/methodoverride.rb:24:in call' actionpack (3.0.4) lib/action_dispatch/middleware/params_parser.rb:21:in call' actionpack (3.0.4) lib/action_dispatch/middleware/flash.rb:182:in call' actionpack (3.0.4) lib/action_dispatch/middleware/session/abstract_store.rb:149:in call' actionpack (3.0.4) lib/action_dispatch/middleware/cookies.rb:302:in call' activerecord (3.0.4) lib/active_record/query_cache.rb:32:in block in call' activerecord (3.0.4) lib/active_record/connection_adapters/abstract/query_cache.rb:28:in cache' activerecord (3.0.4) lib/active_record/query_cache.rb:12:in cache' activerecord (3.0.4) lib/active_record/query_cache.rb:31:in call' activerecord (3.0.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in call' actionpack (3.0.4) lib/action_dispatch/middleware/callbacks.rb:46:in block in call' activesupport (3.0.4) lib/active_support/callbacks.rb:415:in _run_call_callbacks' actionpack (3.0.4) lib/action_dispatch/middleware/callbacks.rb:44:in call' rack (1.2.2) lib/rack/sendfile.rb:107:in call' actionpack (3.0.4) lib/action_dispatch/middleware/remote_ip.rb:48:in call' actionpack (3.0.4) lib/action_dispatch/middleware/show_exceptions.rb:47:in call' railties (3.0.4) lib/rails/rack/logger.rb:13:in call' rack (1.2.2) lib/rack/runtime.rb:17:in call' activesupport (3.0.4) lib/active_support/cache/strategy/local_cache.rb:72:in call' rack (1.2.2) lib/rack/lock.rb:11:in block in call' <internal:prelude>:10:in synchronize' rack (1.2.2) lib/rack/lock.rb:11:in call' actionpack (3.0.4) lib/action_dispatch/middleware/static.rb:30:in call' railties (3.0.4) lib/rails/application.rb:168:in call' railties (3.0.4) lib/rails/application.rb:77:in method_missing' railties (3.0.4) lib/rails/rack/log_tailer.rb:14:in call' rack (1.2.2) lib/rack/content_length.rb:13:in call' rack (1.2.2) lib/rack/handler/webrick.rb:52:in service' /Users/USERNAME_REMOVED/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/webrick/httpserver.rb:111:in service' /Users/USERNAME_REMOVED/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/webrick/httpserver.rb:70:in run' /Users/USERNAME_REMOVED/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/webrick/server.rb:183:in block in start_thread'

+0

顯示你的用戶模型 – 2011-05-03 20:58:19

+0

啊沒有意識到你應該這樣做。通過我的答案,並解決這個問題。 – tks 2011-05-03 20:59:56

+0

檢查params [:session]的值。它實際上是一個數組嗎?我懷疑它是零。併發布發佈到此操作的表單。 – Thilo 2011-05-03 21:13:40

回答

2

params[:session]不存在

def create 
    user = User.authenticate(params[:session][:email], 
         params[:session][:password]) if params[:session] 
    ... 
0

而是在class << self聲明方法authenticate的: class << self def authenticate(email, submitted_password) user = find_by_email(email) (user && user.has_password?(submitted_password)) ? user : nil end end

試試這個:def self.authenticate(email, submitted_password)。要小心,你必須聲明它class << self

在這種情況下,你聲明一個類方法authenticate,你應該能夠在你的控制器,在方法中調用它。