যথাযথভাবে redirect_to করছেন: যখন রেফারার পাওয়া যায় না তখন পুনরায় অন রুবেলে


91

আমি একটি সমস্যা হচ্ছে redirect_to :back। হ্যাঁ, এটি রেফারাররা।

আমি প্রায়শই ব্যতিক্রম পাই

(অ্যাকশনকন্ট্রোলার :: রিডাইরেক্টব্যাকআরর) "এই ক্রিয়াকলাপের অনুরোধে কোনও HTTP_REFERER সেট করা হয়নি, তাই পুনর্নির্দেশ_আর: ব্যাকটি সফলভাবে বলা যায় না this

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


আমার একটি আপডেট ক্রিয়ায় একই ত্রুটি রয়েছে, যা আশ্চর্যজনক কারণ রেফারার খালি থাকতে পারে না (অনুরোধটি কোনও ফর্ম হতে হবে), তবে কিছু ব্যবহারকারী কেবল এটি করতে পেরেছিলেন যা আমি জানি না।
লুলালালা

উত্তর:


144

এটি অসম্ভাব্য যে আপনার কি একটি সেশন আছে এবং না একটি রেফারার আছে।

যে পরিস্থিতিটি কোনও রেফারার সেট করা হয় না তা অস্বাভাবিক নয় এবং আমি সাধারণত সেই এক্সপেশনটি উদ্ধার করি:

def some_method
  redirect_to :back
rescue ActionController::RedirectBackError
  redirect_to root_path
end

আপনি যদি প্রায়শই এটি করেন (যা আমার কাছে একটি খারাপ ধারণা বলে মনে হয়) তবে আপনি মারন পরামর্শ মতো একটি অন্য পদ্ধতিতে এটি মোড়ানো করতে পারেন।

বিটিডাব্লু আমি মনে করি এটি একটি খারাপ ধারণা কারণ এটি ব্যবহারকারী প্রবাহকে দ্ব্যর্থক করে তোলে। শুধুমাত্র লগইনের ক্ষেত্রে এটি বোধগম্য।

আপডেট : যেমনটি বেশিরভাগ লোক নির্দেশ করেছে এটি আর 5. টির সাথে কাজ করে না Instead পরিবর্তে, ব্যবহার করুন redirect_back, এই পদ্ধতিটি একটি ফালব্যাককে সমর্থন করে। কোডটি তখন পরিণত হয়:

def some_method
  redirect_back fallback_location: root_path
end

4
আমি সন্দেহ করি পরিবর্তে রেসকিউ_ফর্ম ব্যবহার করতে আমি এটি পরিবর্তন করব ter
বব আমান

4
@ BobAman IMO rescue_fromকন্ট্রোলারের একাধিক হলে আমরা ব্যবহার করতে পারিredirect_to :back
থিও বি

রেল 5 এর সাথে কাজ করে না, অ্যাকশনকন্ট্রোলার :: রেডাইরেক্টব্যাকআরার অপরিজ্ঞাত ... কী সমাধান?
ম্যাট্রিক্স

পরিবর্তে এটি ব্যবহার করুন:redirect_to (request.referrer || root_url)
অভি

38

এখানে আমার ছোট্ট redirect_to_back পদ্ধতিটি:

  def redirect_to_back(default = root_url)
    if request.env["HTTP_REFERER"].present? and request.env["HTTP_REFERER"] != request.env["REQUEST_URI"]
      redirect_to :back
    else
      redirect_to default
    end
  end

Http_refferrer ফাঁকা থাকলে আপনি অন্য কোথাও যেতে passচ্ছিক url পাস করতে পারেন।


37
def store_location
  session[:return_to] = request.request_uri
end

def redirect_back_or_default(default)
  redirect_to(session[:return_to] || default)
  session[:return_to] = nil
end

চেষ্টা কর! ( অথলোগিক প্লাগইনকে ধন্যবাদ )


22
এটি একটি ভাল সমাধান, তবে আমি যদি এটি ব্যবহার করে এমন কাউকে তা মনে রাখার জন্য অনুরোধ করব যে এটি যদি আপনার অ্যাপ্লিকেশন ব্রাউজ করতে একাধিক ট্যাব ব্যবহার করে তবে এটি ব্যবহারকারীকে অত্যন্ত বিভ্রান্ত করতে পারে "
মিচ লিন্ডগ্রেন

4
+1 প্রশ্নের উত্তর দেওয়ার জন্য এবং নকশা পদ্ধতিগুলির সমালোচনা না করার জন্য।
আবে পেট্রিলো

31

মূল বৈশিষ্ট্য

redirect_backরেল 5+ এর মূল বৈশিষ্ট্য এটি ActionController::Redirectingইতিমধ্যে অন্তর্ভুক্ত মডিউলটিতে উপলব্ধ ApplicationController::Base

প্রসারণ সতর্কতা: হ্রাস redirect_to :backকরা হয়েছে এবং এটি 5.1 রেল থেকে সরানো হবে। অনুরোধটির কোনও HTTP রেফারারের তথ্য না থাকলে দয়া করে redirect_back(fallback_location: fallback_location)যেখানে fallback_locationঅবস্থানটি ব্যবহার করে তা ব্যবহার করুন use

সম্পাদনা: উত্স


উত্সের লিঙ্ক, দয়া করে
ক্রিস ব্লুম

4
@ ক্রিসব্লুম 7 এটি একটি সতর্কতা বার্তা যা আমার সাথে রেলগুলি 5.0.0 বিটা 3 চালানোর সময় ছিল redirect_to :back
সিরিল ডুচন-ডরিস

21

হয়ত দেরি হয়ে গেছে তবে আমি আমার পদ্ধতিটি শেয়ার করতে চাই যা বিকল্পগুলি সংরক্ষণ করে:

  def redirect_back_or_default(default = root_path, *options)
    tag_options = {}
    options.first.each { |k,v| tag_options[k] = v } unless options.empty?
    redirect_to (request.referer.present? ? :back : default), tag_options
  end

আপনি এটি ব্যবহার করতে পারেন:

redirect_back_or_default(some_path, :notice => 'Hello from redirect', :status => 301)

14

আপডেট হয়েছে: কারাগারে 5 টি পুনঃনির্দেশ_ব্যাক্ট পদ্ধতি যুক্ত হয়েছে ( https://github.com/rails/rails/pull/22506/ ), আরও ভাল কেবল ব্যবহার করুন:

redirect_back fallback_location: answer_path(answer), flash: { error: I18n.t('m.errors')}

5.0 এর চেয়ে কম রেলগুলি এখনও নীচে পুরানো পথটি ব্যবহার করতে পারে:

@ ট্রোএক্সের উত্তরের সমান, এটি আপনার অ্যাপ্লিকেশন নিয়ামকটিতে যুক্ত করুন

def redirect_back_or_default(default = root_path, options = {})
  redirect_to (request.referer.present? ? :back : default), options
end

তারপরে এটি আপনার নিয়ামকটিতে ব্যবহার করুন

redirect_back_or_default answer_path(answer), flash: { error: I18n.t('m.errors')}

0

সম্প্রতি, আমি একই সমস্যার মুখোমুখি হয়েছি যেখানে হয় আমাকে পুনর্নির্দেশ করতে হবে :backবা নির্দিষ্ট পৃষ্ঠায়। অনেকগুলি সমাধানে যাওয়ার পরে, আমি অবশেষে এটি খুঁজে পেলাম যা সহজ এবং এটি সমস্যার সমাধান বলে মনে হচ্ছে:


if request.env["HTTP_REFERER"].present?
    redirect_to :back
else
    redirect_to 'specific/page'
end

আপনি যদি sessionবিশদ ব্যবহার করতে চান তবে কোডের অন্য অংশে এটি করুন।

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