2014-04-10 2 views
0

일부 내 요청을 내 4 앱에서 아약스로 마이그레이션하는 중이고 리디렉션에 약간의 문제가 있습니다.PATCH 동사를 사용하여 redirect_to하지 않습니다.

홈 페이지에는 사용/사용 중지 할 수있는 항목 목록이 있습니다. 이것은 모든 내가 현재 사용자가 로그온 한 경우 확인하는 before_action이 있고 ApplicationController에서 한 개의 링크 <%= link_to "disable", toggle_my_class_path(my_class), method: "PATCH", remote: true %>

으로 돌보아되지는 형태의 로그가 표시되는 홈페이지로 리디렉션합니다.

def require_login 
    unless current_user 
    redirect_to root_url, :notice => "Please log in" 
    end 
end 

문제 때문에 어떻게 든 PATCH 동사를 대신 경로 문제의 원인이되는 GET으로 사용하고있는 아약스 호출 (내 생각)이다. 내가 모르겠어요 문제

입니다 : 아래 전화에서 내 로그 출력은

Started PATCH "/my_class/2/toggle" for 127.0.0.1 at 2014-04-10 16:33:52 -0500 
Processing by MyClassController#toggle as JS 
    Parameters: {"id"=>"2"} 
Can't verify CSRF token authenticity 
    (0.1ms) SELECT COUNT(*) FROM "users" 
Redirected to http://localhost:3000/ 
Filter chain halted as :require_login rendered or redirected 
Completed 302 Found in 9ms (ActiveRecord: 1.3ms) 


Started PATCH "/" for 127.0.0.1 at 2014-04-10 16:33:56 -0500 

ActionController::RoutingError (No route matches [PATCH] "/"): 
    actionpack (4.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
    railties (4.0.0) lib/rails/rack/logger.rb:38:in `call_app' 
    railties (4.0.0) lib/rails/rack/logger.rb:21:in `block in call' 
    activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `block in tagged' 
    activesupport (4.0.0) lib/active_support/tagged_logging.rb:25:in `tagged' 
    activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `tagged' 
    railties (4.0.0) lib/rails/rack/logger.rb:21:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
    rack (1.5.2) lib/rack/methodoverride.rb:21:in `call' 
    rack (1.5.2) lib/rack/runtime.rb:17:in `call' 
    activesupport (4.0.0) lib/active_support/cache/strategy/local_cache.rb:83:in `call' 
    rack (1.5.2) lib/rack/lock.rb:17:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/static.rb:64:in `call' 
    railties (4.0.0) lib/rails/engine.rb:511:in `call' 
    railties (4.0.0) lib/rails/application.rb:97:in `call' 
    rack (1.5.2) lib/rack/lock.rb:17:in `call' 
    rack (1.5.2) lib/rack/content_length.rb:14:in `call' 
    rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service' 
    /home/***/.rvm/rubies/ruby-head/lib/ruby/2.1.0/webrick/httpserver.rb:138:in `service' 
    /home/***/.rvm/rubies/ruby-head/lib/ruby/2.1.0/webrick/httpserver.rb:94:in `run' 
    /home/***/.rvm/rubies/ruby-head/lib/ruby/2.1.0/webrick/server.rb:295:in `block in start_thread' 

당신은 ActionController :: RoutingError (없음 경로 일치 [PATCH]를 "/") 것을 알 수있다 이것 주위의 길. PATCH 동사를 사용하고 싶지 않지만 동사를 지정하는 방법을 찾을 수없는 것 같습니다.

의견이 있으십니까?

+2

당신은'ajax' 호출 내에서 서버 측 (컨트롤러)에서 리디렉션 할 수 없습니다 :

예를 들어, 당신은 before_action (안 테스트 코드)를 변경할 수 있습니다. javascript를 통해 검색된 모든 내용이 javacript로 반환됩니다. 따라서 자바 스크립트를 사용하여 리디렉션을 수행해야합니다. – markets

답변

2

아약스 호출 중에 서버 측 (컨트롤러)에서 리디렉션 할 수 없습니다. javascript를 통해 검색된 모든 내용이 javacript로 반환됩니다. 웹 브라우저는 일부 자바 스크립트가 평가 될 것으로 기대하고 있습니다.

그래서 자바 스크립트를 사용하여 리디렉션을 수행해야합니다.

def require_login 
    unless current_user 
    if request.xhr? 
     flash[:notice] = "Please log in" 
     flash.keep(:notice) # Keep flash notice for the redirect 
     render js: "window.location = #{root_url.to_json}" # js to be evaluated 
    else 
     redirect_to root_url, :notice => "Please log in" 
    end 
    end 
end 
+0

그건 의미가 있습니다. 감사. 나는 그것을 시험해보고 당신에게 알려줄 것입니다. – Patrick

+0

그것을 시도하고 잘 작동! 다시 한 번 감사합니다 – Patrick

+0

한 번 더 업데이트합니다. 세션 컨트롤러에 플래시를 유지하는 방법을 알아낼 수 없습니다. 이 질문이 다른 것이어야하지만 내 결과를 문서화하고 싶습니다. 리다이렉트가 성공했지만 이것이 주요한 도전이었습니다. 감사! – Patrick