सही ढंग से रीडायरेक्ट_टो कर रहा है: रेफर पर रूबी में वापस जब रेफरर उपलब्ध नहीं है


91

मुझे समस्या हो रही है redirect_to :back। हाँ, यह रेफरल है।

मुझे अक्सर अपवाद मिलता है

(ActionController :: RedirectBackError) "इस कार्रवाई के अनुरोध में कोई HTTP_REFERER सेट नहीं किया गया था, इसलिए redirect_to: वापस सफलतापूर्वक नहीं बुलाया जा सकता है। यदि यह एक परीक्षण है, तो अनुरोध को निर्दिष्ट करना सुनिश्चित करें।" [HTTP_REFERER \ "]।"

मुझे एहसास है कि यह एक रेफरल उपलब्ध नहीं होने का एक परिणाम है। क्या कोई ऐसा तरीका है, उदाहरण के लिए, प्रत्येक अंतिम पृष्ठ पर जाने के साथ प्रत्येक एक्सेस पर एक सत्र चर सेट कर सकता है, और जब HTTP_REFERER उपलब्ध नहीं है, तो इस सत्र चर का उपयोग पुनर्निर्देशित करने के लिए करें?


मुझे अपडेट एक्शन में वही त्रुटि है, जो अजीब है क्योंकि रेफ़रर खाली नहीं हो सकता है (जैसा कि फॉर्म से अनुरोध होगा), लेकिन कुछ उपयोगकर्ता बस ऐसा करने में कामयाब रहे, जो मुझे नहीं पता कि कैसे।
लललाला

जवाबों:


144

यह संभावना नहीं है कि आप कर एक सत्र है और नहीं है एक रेफ़रलकर्ता की है।

ऐसी स्थिति जो एक रेफ़रर सेट नहीं है, वह असामान्य नहीं है और मैं आमतौर पर उस अवसान को बचा लेता हूँ:

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

यदि आप अक्सर ऐसा करते हैं (जो मुझे लगता है कि एक बुरा विचार है) तो आप इसे अन्य तरीके से लपेट सकते हैं जैसे कि मारन सुझाव देते हैं।

BTW मुझे लगता है कि यह एक बुरा विचार है क्योंकि यह उपयोगकर्ताप्रवाह को अस्पष्ट बनाता है। केवल एक लॉगिन के मामले में यह समझदार है।

अद्यतन : जैसा कि कई लोगों ने बताया कि यह अब रेल 5 के साथ काम नहीं करता है । इसके बजाय, उपयोग करें redirect_back, यह विधि भी गिरावट का समर्थन करती है। फिर कोड बन जाता है:

def some_method
  redirect_back fallback_location: root_path
end

4
मुझे संदेह है कि मैं इसके बदले बचाव_फ्रेम का उपयोग करने के लिए इसे बदल दूंगा।
बॉब अमन

1
@ ोबासमैन IMO हम उपयोग कर सकते हैं rescue_fromयदि नियंत्रक कई थाredirect_to :back
Theo B

5 के साथ काम नहीं करता है, ActionController :: RedirectBackError अपरिभाषित है ... क्या समाधान है?
मैट्रिक्स

इसकी जगह इसका प्रयोग करें:redirect_to (request.referrer || root_url)
अभि

38

यहां मेरी छोटी रीडायरेक्ट_टो_बैक विधि है:

  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 रिक्त है तो आप कहीं और जाने के लिए एक वैकल्पिक 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
यह एक अच्छा समाधान है, लेकिन मैं किसी को भी इसका उपयोग करने के लिए आग्रह करूंगा कि यह ध्यान में रखे कि यह "तोड़" सकता है एक तरह से उपयोगकर्ता को बहुत भ्रमित करता है यदि वह आपके ऐप को ब्राउज़ करने के लिए कई टैब का उपयोग कर रहा है।
मिच लिंडग्रेन

3
+1 प्रश्न का उत्तर देने के लिए और डिजाइन विधियों की आलोचना न करने के लिए।
अबे पेट्रिलो

31

मुख्य विशेषता

redirect_backरेल 5+ से एक मुख्य विशेषता है, यह उस ActionController::Redirectingमॉड्यूल में उपलब्ध है जो पहले से ही इसमें शामिल है ApplicationController::Base

समीक्षा चेतावनी: redirect_to :backपदावनत कर दिया गया है और रेल 5.1 से हटा दिया जाएगा। कृपया उपयोग करें redirect_back(fallback_location: fallback_location)जहां fallback_locationअनुरोध का कोई HTTP संदर्भ जानकारी नहीं है, तो उपयोग करने के लिए स्थान का प्रतिनिधित्व करता है।

संपादित करें: स्रोत


स्रोत से लिंक करें, कृपया
क्रिस ब्लूम

1
@ Chrisbloom7 यह एक चेतावनी संदेश है जिसके साथ मैंने 5.0.0beta3 रेल चला रहा था 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विवरण का उपयोग करना चाहते हैं , तो इसे कोड के दूसरे भाग में करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.