Rails 3 AJAX: неверное имя константы - PullRequest
0 голосов
/ 10 сентября 2011

Я пытаюсь войти в Ajax через Devise, как объяснено здесь: http://jessehowarth.com/2011/04/27/ajax-login-with-devise#comment-5 (см. Комментарий от jBeasley).

Мой контроллер пытается вернуть

class Users::SessionsController < Devise::SessionsController
  def failure
    render :json => {:success => false, :errors => ["Login failed."]}
  end
end

, что приводит к этой ошибке:

NameError (wrong constant name ["{\"success\":false,\"errors\":[\"Login failed.\"]}"]Controller):

и Firebug, показывающий [500 Internal Server Error].

Как я могу это исправить? Я использую Rails 3.1 и разрабатываю 1.4.5.

Спасибо !!

Ответы [ 2 ]

3 голосов
/ 10 сентября 2011

Вы сделали шаг, рекомендованный Джеффом Полтоном в комментарии № 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", чтобы попытаться выяснитькласс контроллера отказов.

0 голосов
/ 10 сентября 2011

Вы пропускаете возврат в

def failure
    return render:json => {:success => false, :errors => ["Login failed."]}
end

Имеет ли это значение?

...