রেলস 3: অ্যাজাক্স কলটিতে কীভাবে "redirect_to" করবেন?


85

attempt_loginলগইন ফর্মটি জমা দেওয়ার পরে অ্যাজাক্স ব্যবহার করে নিম্নলিখিত পদ্ধতিটি বলা হয়।

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কাজ করে না।

কীভাবে সমাধান করবেন?

উত্তর:


102

অবশেষে, আমি সবেমাত্র প্রতিস্থাপন করেছি

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

এর সাথে:

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

এবং এটি ঠিক কাজ করে!


43
আরও ভাল পন্থা হবেrender :js => "window.location = '#{jobs_path}'"
জেকলফাসি

4
এটি কাজ করে, তবে প্রকৃত জসন সাফল্যের বার্তার সাহায্যে পুনর্নির্দেশের অবস্থানটি ফিরে দেওয়া এবং সম্মুখ প্রান্তে পুনর্নির্দেশ করা কি আরও ভাল হবে না?
justinxreese

4
jobs_pathমূলত ইউআরএল এর মতো অনমনীয় কি না ? যদি ইউআরএল পরিবর্তিত হয়, তবে রুটের নামটিও যদি আপনার অতিরিক্ত যত্নবান না হয় would অন্য বিকল্প render js: "window.location = '#{polymorphic_path(@job.class)}'"হ'ল এবং কাজের মডেলের উপর ভিত্তি করে গণনা করা রিসোর্ফুল রুটটি ব্যবহার করুন। এটি কেবল তখনই কার্যকর হয় যদি আপনার রুটগুলি সম্পদশালী হয় এবং আপনার মডেলগুলির সাথে সীমাবদ্ধ মানক নামকরণ কনভেনশন ব্যবহার করে। (অথবা আপনি আপনার মডেলের উপর MODEL_NAME উল্লেখ যাতে তারা সঠিক রুট নাম উৎপন্ন করে।)
ছাপ

4
অসাধারণ. সহজ redirect_to কাজ করে না কেন কারও ধারণা আছে?
তাসোস আনিসিয়াদিস

4
@ টাসোস আনিসিয়াদিস, ফর্মটি 'রিমোট' রেল ফর্ম হওয়ার সময় পুনর্নির্দেশ_তে কাজ করে না কারণ ব্রাউজারটিকে জাভাস্ক্রিপ্ট হিসাবে নিয়ামকের কাছ থেকে প্রাপ্ত প্রতিক্রিয়ার ব্যাখ্যা করতে বলা হয়েছিল। আপনি Chrome DevTools এর রেসপন্স ট্যাবে redirect_to পৃষ্ঠা দেখতে পাচ্ছেন (নেটওয়ার্ক প্যানেলের মাধ্যমে) তবে এর পরিবর্তে যা দরকার তা হ'ল নিয়মকর্তাকে ব্রাউজারের একটি ভিন্ন পৃষ্ঠা খুঁজে পাওয়ার নির্দেশনা। এখানে প্রদত্ত উইন্ডো.এলোকেশন সমাধানগুলি, বা নিয়মিত 'স্থানীয়' ফর্মটিতে ফর্ম পরিবর্তন করা প্রয়োজন, যদি না আপনি আনতে () এবং জেএসএনের মাধ্যমে ফর্মের ডেটা ম্যানুয়ালি জমা দিতে এবং প্রক্রিয়া করতে চান into
এমএসসি

68

পরবর্তী অনুরোধের জন্য ফ্ল্যাশ রাখার খুব সহজ উপায় রয়েছে। আপনার নিয়ামক কিছু ভালো কিছু করুন

flash[:notice] = 'Your work was awesome! A unicorn is born!'
flash.keep(:notice)
render js: "window.location = '#{root_path}'"

flash.keepনিশ্চিত ফ্ল্যাশ পরবর্তী অনুরোধের জন্য রাখা হয় করতে হবে। সুতরাং যখন root_pathরেন্ডার করা হয়, এটি প্রদত্ত ফ্ল্যাশ বার্তাটি প্রদর্শন করবে। রেলগুলি দুর্দান্ত :)


28

আমি মনে করি এটি সামান্য সুন্দর:

render js: "window.location.pathname='#{jobs_path}'"


12
কিছুটা সামান্য render js: "window.location.pathname = #{jobs_path.to_json}"
উত্তম

26

আমার একটি অ্যাপে আমি পুনঃনির্দেশ এবং ফ্ল্যাশ বার্তা ডেটা চালিয়ে যেতে 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.
  }
})

4
এখানে অনেক ভাল তথ্য। রেন্ডারটির ভাল এবং যথাযথ ব্যবহার: অবস্থান, এর: স্থিতি বিকল্প এবং এক্সএইচআর? চেক। আরও বেশি ওয়েব অ্যাপ্লিকেশন যেমন মোবাইল অ্যাপ্লিকেশন এবং সেগুলি পরিবেশন করতে এপিআইগুলিকে গ্রহণ করে, আমি আশা করি এই পোস্টের জিনিসগুলি আরও মানসম্পন্ন হয়ে উঠবে। অবশ্যই আমার উর্ধ্বতন আছে। দুর্দান্ত উত্তর
TheJKFever

18

সমস্ত উত্তরের সংমিশ্রণ:

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

আপনার উত্তরের জন্য ধন্যবাদ, আমি এটি ব্যবহার করেছি। যাইহোক, এখন পরীক্ষার জন্য, আমি যখন এই কর্মটিকে জেএস হিসাবে অনুরোধ করার চেষ্টা করি তখন এটি একটি কর্ন সতর্কতা উত্থাপন করে: অ্যাকশনকন্ট্রোলার :: অবৈধক্রসআরগিনআরকোয়েস্ট। পরীক্ষায় এটি কীভাবে সংহত করা যায় সে সম্পর্কে আপনার কোনও ধারণা আছে?
ভি। দাহায়ে

1
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

0

আমি আমার নিয়ন্ত্রণকারী ক্রিয়াকে সংশোধন করতে চাইনি তাই আমি এই হ্যাকটি নিয়ে এসেছি:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.