Devise不会在会话控制器上调用自定义故障

时间:2014-08-12 19:43:18

标签: ruby-on-rails ruby ajax devise

我有以下自定义会话控制器:

class SessionsController < Devise::SessionsController
    respond_to :json

 def create
    logger.debug(" CUSTOM AUTHENTICATION!!!!!!")
    self.resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure")
    sign_in(resource_name, resource)
    render json: { :success => true }, status: 200
  end

  def failure
    logger.debug(" CUSTOM FAILURE!!!!!!")
    warden.custom_failure!
    render json: { success: false, errors: ["Login Credentials Failed"] }, status: 401
  end

end

我正在调用Ajax,我需要这个成功参数才能处理回调。

身份验证工作正常。我收到了success: true作为回复

但是当身份验证失败时,我收到了默认响应:

"NetworkError: 401 Unauthorized - http://localhost:3000/users/sign_in.json"

Parameters:
  {"error":"Invalid e-mail or password"}

我在那里错过了什么?为什么设计不会调用我的自定义失败消息?

我已经配置了devise.rb config:

config.navigational_formats = ["*/*", :html, :json]

2 个答案:

答案 0 :(得分:0)

你正在修补Devise的SessionsController - 这个控制器在SessionsController中没有失败方法,你可以看到here。 401由 new 方法生成。但是,我不会修补那个方法,而是使用像这样的after_filter:

class SessionsController < Devise::SessionsController
  after_filter :handle_failed_login, :only => :new

  private
  def handle_failed_login
    if failed_login?
      render json: { success: false, errors: ["Login Credentials Failed"] }, status: 401
    end
  end 

  def failed_login?
    (options = env["warden.options"]) && options[:action] == "unauthenticated"
  end 
end

答案 1 :(得分:0)

您只需编辑设计配置并更改config.navigational_formats即可 然后使用以下命令更改路径:format =&gt; :JSON

配置/初始化/ devise.rb

    config.navigational_formats = ['*/*', :html, :json]

应用程序/视图/设计/会话/ new.html.erb

    api_v1_new_user_session_path(resource_name, :format => :json)

如果您进行此更改,则:调用将起作用