我正在尝试使用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。
谢谢!
答案 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
这会有所作为吗?