[RUBY-ON-RAILS] 3 레일 : 어떻게 Ajax 호출에 "redirect_to"에?
RUBY-ON-RAILS3 레일 : 어떻게 Ajax 호출에 "redirect_to"에?
다음 attempt_login 방법은 로그인 양식이 제출 한 후 Ajax를 사용하여 호출한다.
class AccessController < ApplicationController
[...]
def attempt_login
authorized_user = User.authenticate(params[:username], params[:password])
if authorized_user
session[:user_id] = authorized_user.id
session[:username] = authorized_user.username
flash[:notice] = "Hello #{authorized_user.name}."
redirect_to(:controller => 'jobs', :action => 'index')
else
[...]
end
end
end
문제는 redirect_to가 작동하지 않는다는 것입니다.
당신은이 문제를 어떻게 해결할 것인가?
해결법
-
==============================
1.마지막으로, 난 그냥 교체
마지막으로, 난 그냥 교체
redirect_to(:controller => 'jobs', :action => 'index')
이와 :
render :js => "window.location = '/jobs/index'"
그리고 그것을 잘 작동합니다!
-
==============================
2.다음 요청에 대한 플래시를 유지하는 아주 쉬운 방법이있다. 컨트롤러에서 그런 짓을
다음 요청에 대한 플래시를 유지하는 아주 쉬운 방법이있다. 컨트롤러에서 그런 짓을
flash[:notice] = 'Your work was awesome! A unicorn is born!' flash.keep(:notice) render js: "window.location = '#{root_path}'"
flash.keep 확실히 플래시가 다음 요청을 유지하게됩니다. root_path가 렌더링 될 때, 그것은 주어진 플래시 메시지가 표시됩니다. 레일은 굉장합니다 :)
-
==============================
3.나는이 약간 더 좋은 생각 :
나는이 약간 더 좋은 생각 :
JS 렌더링 : "window.location.pathname = '# {jobs_path}'"
-
==============================
4.내 애플 리케이션 중 하나에서, 내가 리디렉션 및 플래시 메시지 데이터를 수행하기 위해 JSON을 사용합니다. 그것은 다음과 같이 보일 것입니다 :
내 애플 리케이션 중 하나에서, 내가 리디렉션 및 플래시 메시지 데이터를 수행하기 위해 JSON을 사용합니다. 그것은 다음과 같이 보일 것입니다 :
class AccessController < ApplicationController ... def attempt_login ... if authorized_user if request.xhr? render :json => { :location => url_for(:controller => 'jobs', :action => 'index'), :flash => {:notice => "Hello #{authorized_user.name}."} } else redirect_to(:controller => 'jobs', :action => 'index') end else # Render login screen with 422 error code render :login, :status => :unprocessable_entity end end end
그리고 간단한 jQuery를 예는 다음과 같습니다
$.ajax({ ... type: 'json', success: functon(data) { data = $.parseJSON(data); if (data.location) { window.location.href = data.location; } if (data.flash && data.flash.notice) { // Maybe display flash message, etc. } }, error: function() { // If login fails, sending 422 error code sends you here. } })
-
==============================
5.모든 대답의 장점을 결합 :
모든 대답의 장점을 결합 :
... if request.xhr? flash[:notice] = "Hello #{authorized_user.name}." flash.keep(:notice) # Keep flash notice around for the redirect. render :js => "window.location = #{jobs_path.to_json}" else ...
-
==============================
6.
def redirect_to(options = {}, response_status = {}) super(options, response_status) if request.xhr? # empty to prevent render duplication exception self.status = nil self.response_body = nil path = location self.location = nil render :js => "window.location = #{path.to_json}" end end
-
==============================
7.나는이 해킹 함께했다 그래서 난 내 컨트롤러 액션을 수정하지 않았다
나는이 해킹 함께했다 그래서 난 내 컨트롤러 액션을 수정하지 않았다
class ApplicationController < ActionController::Base def redirect_to options = {}, response_status = {} super if request.xhr? self.status = 200 self.response_body = "<html><body><script>window.location.replace('#{location}')</script></body></html>" end end end
from https://stackoverflow.com/questions/5454806/rails-3-how-to-redirect-to-in-ajax-call by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] ActiveRecord.find (array_of_ids), 보존하기 위해 (0) | 2020.02.07 |
---|---|
[RUBY-ON-RAILS] 레일에 액티브 제거 3 (0) | 2020.02.07 |
[RUBY-ON-RAILS] 어떻게 해결하기 위해 Windows에서 "인증서 확인 실패"? (0) | 2020.02.07 |
[RUBY-ON-RAILS] 어떻게 개발에 레일 3 서버의 기본 포트를 변경하려면? (0) | 2020.02.07 |
[RUBY-ON-RAILS] 때 하나는 "has_many을 :을 통해"사용해야 레일의 관계? (0) | 2020.02.07 |