Rails 3 AJAX:错误的常量名称

时间:2011-09-10 04:29:47

标签: ajax controller devise ruby-on-rails-3.1

我正在尝试使用Devise进行Ajax登录,如下所述: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内部服务器错误]。

我该如何解决这个问题?我正在运行Rails 3.1并设计1.4.5。

谢谢!

2 个答案:

答案 0 :(得分:3)

您是否在评论#4中执行了Jeff Poulton推荐的步骤? 1.4.5中的:recall选项看起来与旧版本完全不兼容。它现在需要你发送控制器,而在你正在关注的教程中他只是发送动作(旧的方式)。

在您的情况下,:recall => :failure 必须在Devise 1.4.5中更改为:recall => "users/sessions#failure"

这是因为确定了故障动作的控制器的方式。在旧版本中,它只是从参数中拉出来的。

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”到试图确定失败控制人的班级。

答案 1 :(得分:-1)

你错过了

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

这会有所作为吗?