Вы сделали шаг, рекомендованный Джеффом Полтоном в комментарии № 4?Опция :recall
в 1.4.5 выглядит полностью несовместимой с более старыми версиями.Теперь требуется, чтобы вы отправили контроллер, тогда как в учебном пособии, которое вы читаете, он просто отправляет действие (по-старому).
В вашем случае :recall => :failure
необходимо изменить на:recall => "users/sessions#failure"
в Devise 1.4.5.
Это из-за способа, которым определяется контроллер для действия отказа.В старых версиях его просто извлекали из параметров.
def recall_controller
"#{params[:controller]}.camelize}Controller".constantize
end
# called via recall_controller.action(warden_options[:recall]).call(env)
В версии 1.4.5 он ожидает строку, указывающую контроллер и действие, в стиле маршрутов:
def recall_app(app)
controller, action = app.split('#')
controller_name = ActiveSupport::Inflector.camelize(controller)
controlller_klass = ActiveSupport::Inflector.constantize("#{controller_name}Controller")
controller_klass.action(action)
end
# called via recall_app(warden_options[:recall]).call(env)
Казалось бы, ваше приложение на самом деле передает JSONified хэш опций recall_app
, который, без '#', не разделяется, и вся строка объединяется с "Controller", чтобы попытаться выяснитькласс контроллера отказов.