NoMethodError в Ruby on Rails, вызывающий метод класса из контроллера - PullRequest
2 голосов
/ 04 мая 2011

Я только изучаю RoR и столкнулся с моей первой настоящей ошибкой. Был бы очень признателен за некоторые рекомендации с ним. Я дошел до того, чтобы создать функцию входа / выхода пользователя для сайта, который я создаю, который будет поддерживаться с помощью сессий. Когда форма входа отправляется, она отправляется в контроллер сессий, который вызывает метод create. Когда он делает это, он отображает эту ошибку:

NoMethodError in SessionsController # создать

У вас есть нулевой объект, когда вы этого не сделали ожидайте этого! Вы могли ожидать экземпляр ActiveRecord :: Base. произошла ошибка при оценке 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

Трассировка приложения говорит об ошибке на

app / controllers / session_controller.rb: 34: в `create '

Так что, похоже, проблема в методе аутентификации. Это метод класса, определенный для моего пользовательского объекта. Странно то, что я протестировал метод в консоли rails, и он работает нормально. Ниже приведен полный след. Опять был бы очень признателен за помощь с этим. Спасибо тебе.

Трассировка:

приложение / контроллеры / sessions_controller.rb: 34: в create' actionpack (3.0.4) lib/action_controller/metal/implicit_render.rb:4:in send_action 'actionpack (3.0.4) Библиотека / abstract_controller / base.rb: 150: в process_action' actionpack (3.0.4) lib/action_controller/metal/rendering.rb:11:in process_action 'actionpack (3.0.4) Библиотека / abstract_controller / callbacks.rb: 18: в block in process_action' activesupport (3.0.4) lib/active_support/callbacks.rb:435:in пробег _4224187041876590211__process_action_ 3718750575726612430 _callbacks' Активная поддержка (3.0.4) Библиотека / active_support / callbacks.rb: 409: в _run_process_action_callbacks' activesupport (3.0.4) lib/active_support/callbacks.rb:93:in run_callbacks 'actionpack (3.0.4) Библиотека / abstract_controller / callbacks.rb: 17: в process_action' actionpack (3.0.4) lib/action_controller/metal/instrumentation.rb:30:in блок в process_action ' Активная поддержка (3.0.4) Библиотека / active_support / notifications.rb: 52: в block in instrument' activesupport (3.0.4) lib/active_support/notifications/instrumenter.rb:21:in инструмент 'активная поддержка (3.0.4) Библиотека / active_support / notifications.rb: 52: в instrument' actionpack (3.0.4) lib/action_controller/metal/instrumentation.rb:29:in process_action 'actionpack (3.0.4) Библиотека / action_controller / металл / rescue.rb: 17: в process_action' actionpack (3.0.4) lib/abstract_controller/base.rb:119:in process 'actionpack (3.0.4) Библиотека / abstract_controller / rendering.rb: 41: в process' actionpack (3.0.4) lib/action_controller/metal.rb:138:in рассылка 'actionpack (3.0.4) Библиотека / action_controller / металл / rack_delegation.rb: 14: в dispatch' actionpack (3.0.4) lib/action_controller/metal.rb:178:in блок в действии 'actionpack (3.0.4) Библиотека / action_dispatch / маршрутизации / route_set.rb: 62: в call' actionpack (3.0.4) lib/action_dispatch/routing/route_set.rb:62:in рассылка 'actionpack (3.0.4) Библиотека / action_dispatch / маршрутизации / route_set.rb: 27: в call' rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in блок в вызове 'стоечный (0.6.14) Библиотека / стойка / крепление / code_generation.rb: 93: в block in recognize' rack-mount (0.6.14) lib/rack/mount/code_generation.rb:68:in optimized_each 'для монтажа в стойку (0.6.14) Библиотека / стойка / крепление / code_generation.rb: 92: в recognize' rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in call 'actionpack (3.0.4) Библиотека / action_dispatch / маршрутизации / route_set.rb: 492: в call' actionpack (3.0.4) lib/action_dispatch/middleware/best_standards_support.rb:17:in call 'actionpack (3.0.4) Библиотека / action_dispatch / промежуточный слой / head.rb: 14: в call' rack (1.2.2) lib/rack/methodoverride.rb:24:in call 'actionpack (3.0.4) Библиотека / action_dispatch / промежуточного программного обеспечения / params_parser.rb: 21: в call' actionpack (3.0.4) lib/action_dispatch/middleware/flash.rb:182:in call 'actionpack (3.0.4) Библиотека / action_dispatch / промежуточная / сессия / abstract_store.rb: 149: в call' actionpack (3.0.4) lib/action_dispatch/middleware/cookies.rb:302:in call 'activerecord (3.0.4) Библиотека / active_record / query_cache.rb: 32: в block in call' activerecord (3.0.4) lib/active_record/connection_adapters/abstract/query_cache.rb:28:in кэш 'activerecord (3.0.4) Библиотека / active_record / query_cache.rb: 12: в cache' activerecord (3.0.4) lib/active_record/query_cache.rb:31:in call 'activerecord (3.0.4) Библиотека / active_record / connection_adapters / абстрактные / connection_pool.rb: 354: в call' actionpack (3.0.4) lib/action_dispatch/middleware/callbacks.rb:46:in блок в call 'activesupport (3.0.4) Библиотека / active_support / callbacks.rb: 415: в _run_call_callbacks' actionpack (3.0.4) lib/action_dispatch/middleware/callbacks.rb:44:in стойка вызова (1.2.2) lib / rack / sendfile.rb: 107: в call' actionpack (3.0.4) lib/action_dispatch/middleware/remote_ip.rb:48:in call 'actionpack (3.0.4) Библиотека / action_dispatch / промежуточный слой / show_exceptions.rb: 47: в call' railties (3.0.4) lib/rails/rack/logger.rb:13:in вызов» 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 стойка вызова (1.2.2) lib / rack / lock.rb: 11: в block in call' <internal:prelude>:10:in синхронизировать ' rack (1.2.2) lib / rack / lock.rb: 11: в call' actionpack (3.0.4) lib/action_dispatch/middleware/static.rb:30:in call 'railties (3.0.4) lib / rails / application.rb: 168: в call' railties (3.0.4) lib/rails/application.rb:77:in method_missing 'railties (3.0.4) Библиотека / рельсы / стойки / log_tailer.rb: 14: в call' rack (1.2.2) lib/rack/content_length.rb:13:in стойка вызова (1.2.2) Библиотека / стойка / обработчик / webrick.rb: 52: в service' /Users/USERNAME_REMOVED/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/webrick/httpserver.rb:111:in сервис» /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 блок в start_thread '

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

params[:session] не существует

def create
  user = User.authenticate(params[:session][:email],
                        params[:session][:password]) if params[:session]
   ...
0 голосов
/ 04 мая 2011

Вместо объявления метода authenticate в class << self: 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, и вы должны иметь возможность вызывать его в своем контроллере, в методе create.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...