2011-09-10 1 views
0

여기에 설명 된대로, Devise로 Ajax 로그인을 시도하고 있습니다 : http://jessehowarth.com/2011/04/27/ajax-login-with-devise#comment-5 (jBeasley의 코멘트 참조).레일즈 3 AJAX : 틀린 상수 이름

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

및 파이어 버그 [500 내부 서버 오류] 표시 :

내 컨트롤러이 오류가 발생

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

를 반환하려고 시도한다.

어떻게 해결할 수 있습니까? 나는 Rails 3.1을 실행 중이며 1.4.5를 고안한다.

감사합니다.

답변

3

의견 # 4에서 Jeff Poulton이 추천 한 단계를 수행 했습니까? 1.4.5의 :recall 옵션은 이전 버전과 완전히 호환되지 않는 것으로 보입니다. 튜토리얼에서는 컨트롤러를 보내야합니다. 컨트롤러를 보내야합니다. 자습서에서는 다음과 같이 액션을 보냅니다 (예전 방식).

귀하의 경우, Devise 1.4.5에서 :recall => :failure:recall => "users/sessions#failure"으로 변경해야합니다.

이는 오류 조치에 대한 컨트롤러가 결정되는 방식 때문입니다. 이전 버전에서는 단순히 매개 변수에서 가져 왔습니다. 앱이 실제로 옵션의 JSONified 해시를 통과 것처럼

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) 

그것은 것 같다 : 1.4.5에서

def recall_controller 
    "#{params[:controller]}.camelize}Controller".constantize 
end 

# called via recall_controller.action(warden_options[:recall]).call(env) 

, 그것은 문자열 경로의 스타일로, 컨트롤러와 동작을 지정하는 기대 '#'가없는 recall_app으로 분할되고 전체 문자열이 "컨트롤러"에 연결되어 오류 컨트롤러의 클래스를 확인하려고 시도합니다.

+0

내가하고있는 일은 : 회피 => 실패. 나는 그것을 "users/sessions # failure"로 변경했고, 방화범은 { "success": false, "errors": [ "Login failed."]} 응답으로 얻습니다. 대단히 감사합니다!! – suruen

+0

확장 설명해 주셔서 감사합니다. 원래 버전이 경로가 잘못 지정된 경우에도 def failure를 호출했기 때문에 나는 혼란 스러웠습니다. 그래서 내 질문은 '왜 내 버전에서는 오류가 발생하지만 올바른 경로는 제공되지 않을 것입니다. 둘 다 호출 방어 실패가 발생합니다.' 분할에 대한 귀하의 설명은 의미가 있습니다 - 나는 직접 소스 코드를 따르고 과정에서 몇 가지 레일을 배우려고 노력할 것입니다 ... 다시 한번 감사드립니다! – suruen

+1

hah 나는 실제 JSON을 메서드에 적용하는 이유를 알아 내고 첫 번째 주석을 발견하는 것을보고있었습니다. 물론 실패 메서드가 호출되었습니다. 실제로 인라인이라고 부르기 때문입니다. 튜토리얼을 참고하면 나중에 호출 할 호출 메소드를 참조하여 심볼': failure '를 전달합니다. JSON을'warden [: recall]'로 저장하고 결국'recall_app'로 곧바로 전송합니다. 그 이상한 불변의 전화가 어떻게 발생했는지 알 수 있습니다. – numbers1311407

-1

당신은 변화를

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

합니까에서 수익을 누락?

+0

차이점이 없으므로 반환은 선택 사항입니다. – suruen