복붙노트

[RUBY-ON-RAILS] 3 레일 : 어떻게 Ajax 호출에 "redirect_to"에?

RUBY-ON-RAILS

3 레일 : 어떻게 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. ==============================

    1.마지막으로, 난 그냥 교체

    마지막으로, 난 그냥 교체

    redirect_to(:controller => 'jobs', :action => 'index')
    

    이와 :

    render :js => "window.location = '/jobs/index'"
    

    그리고 그것을 잘 작동합니다!

  2. ==============================

    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. ==============================

    3.나는이 약간 더 좋은 생각 :

    나는이 약간 더 좋은 생각 :

    JS 렌더링 : "window.location.pathname = '# {jobs_path}'"

  4. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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
    
  8. from https://stackoverflow.com/questions/5454806/rails-3-how-to-redirect-to-in-ajax-call by cc-by-sa and MIT license