रूबी ऑन रेल्स में पिछले पृष्ठ पर पुनर्निर्देशित कैसे करें?


186

मेरे पास एक पृष्ठ है जो उन सभी परियोजनाओं को सूचीबद्ध करता है जिनमें सॉर्ट करने योग्य हेडर और पेजिनेशन हैं।

path:
/projects?order=asc&page=3&sort=code

मैं परियोजनाओं में से एक को संपादित करने का चयन करता हूं

path:
projects/436/edit

जब मैं उस पेज पर सेव पर क्लिक करता हूं, तो यह प्रोजेक्ट्स कंट्रोलर / अपडेट मेथड को कॉल करता है। कोड को अपडेट करने के बाद, मैं उस पथ पर पुनर्निर्देशित करना चाहता हूं जो मैंने किसी विशिष्ट परियोजना को संपादित करने से पहले क्लिक किया था। दूसरे शब्दों में, मैं एक ही पेज पर एक ही सॉर्टिंग के साथ रहना चाहता हूं।

मैंने link_to (: back) को देखा और सोचा कि: back redirect_to (: back) में काम कर सकता है, लेकिन यह एक नहीं है।

puts YAML::dump(:back) 
yields the following:
:back 

कैसे मैं यह काम करने के लिए मिल सकता है पर कोई विचार। यह एक समस्या की तरह लगता है जो आसानी से हल हो जाएगी, लेकिन मैं आरआर के लिए नया हूं।

जवाबों:


323

अपनी संपादित कार्रवाई में, सत्र हैश में अनुरोध url को संग्रहीत करें, जो कई अनुरोधों पर उपलब्ध है:

session[:return_to] ||= request.referer

फिर एक सफल बचत के बाद, अपने अपडेट एक्शन में इसे रीडायरेक्ट करें:

redirect_to session.delete(:return_to)

68
मैं redirect_to session.delete(:return_to)अद्यतन कार्रवाई में सुझाव दूंगा। यह सत्र से मूल्य को साफ करता है, क्योंकि इसकी अब कोई आवश्यकता नहीं है।
15

19
कई टैब खुले होने से यह तर्क भ्रमित नहीं होता है?
jones

12
क्या आप नहीं कर सकते redirect_to request.referer?
एले मुंडी

1
@DanMundy नहीं, इसके लिए काम करना चाहिए request.referer.referer, अगर यह संभव हो सकता है। @ जय बेल्मेयर क्यों ||=?
एक्स-यूरी

@ जोंस हाँ। यदि आप किसी अन्य मॉडल संपादन पर स्विच करते हैं तो भी भ्रम है। मुझे भी क्यों दिलचस्पी है? =
माउरो

99

redirect_to(:back)आपके लिए काम क्यों नहीं किया जाता है, क्यों यह एक नहीं है?

redirect_to(:back)मेरे लिए एक आकर्षण की तरह काम करता है। यह सिर्फ एक शॉर्ट कट है redirect_to(request.env['HTTP_REFERER'])

http://apidock.com/rails/ActionController/Base/redirect_to (पूर्व रेल 3) या http://apidock.com/rails/ActionController/Redirecting/redirect_to (रेल 3)

कृपया ध्यान दें कि redirect_to(:back)रेल 5 में पदावनत किया जा रहा है। आप उपयोग कर सकते हैं

redirect_back(fallback_location: 'something')इसके बजाय ( http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html देखें )


12
redirect_to :backया तो मेरे लिए अच्छी तरह से काम नहीं करता है, कहते हैं कि आप यात्रा करते हैं /posts/new, यह अगले अनुरोध के लिए संदर्भकर्ता के रूप में सेट किया जाता है, इसलिए फॉर्म सफलतापूर्वक जमा होने के बाद यह फिर से फॉर्म दिखाता है, अर्थात /posts/new। हालांकि यह अन्य उद्देश्यों के लिए अच्छी तरह से काम करता है।
क्रिश

यानी ओपी दो बार वापस भेजना चाहता है। मुझे यकीन है वह बस सकता है redirect_to projects_path
x-yuri

हाँ। redirect_back अच्छी तरह से रेल 5 में के रूप में काम नहीं करता है
strizzwald

@strizzwald "क्या काम नहीं करता है" का मतलब है? कोई विवरण?
पास्कल

@pascalbetz, मेरा क्या मतलब है कि अगर HTTP_REFERERसेट नहीं किया गया है, तो आप प्राप्त कर सकते हैं ActionController::RedirectBackError, आपको उस मामले में इस अपवाद से बचाव करना होगा। मेरी समझ से, का उपयोग करने के redirect_backलिए किसी भी अपवाद से निपटने की आवश्यकता नहीं है क्योंकि आप प्रदान करने के लिए मजबूर हैं fallback_location। शायद 'अच्छा काम नहीं करता ’यह डालने का सही तरीका नहीं है।
स्ट्राइज्वालड

45

मुझे एक अपवाद के साथ Jaime की विधि पसंद है, इसने मेरे लिए हर बार रेफ़र को पुनः संग्रहित करने के लिए बेहतर काम किया:

def edit
    session[:return_to] = request.referer
...

इसका कारण यह है कि यदि आप कई वस्तुओं को संपादित करते हैं, तो आपको हमेशा Jaime की विधि के साथ सत्र में संग्रहीत पहले URL पर वापस भेज दिया जाएगा। उदाहरण के लिए, मान लें कि मेरे पास Apple और Orange ऑब्जेक्ट हैं। मैं Apple को संपादित करता हूं और session[:return_to]उस कार्रवाई के संदर्भ में सेट हो जाता हूं । जब मैं एक ही कोड का उपयोग करके संतरे को संपादित करने के लिए जाता हूं, session[:return_to]तो इसे सेट नहीं किया जाएगा क्योंकि यह पहले से ही परिभाषित है। इसलिए जब मैं ऑरेंज को अपडेट करता हूं, तो मैं पिछले ऐप्पल # एडिट एक्शन के रेफर करने वाले को भेजूंगा।


हाँ, लेकिन क्या आप सुझाव दे सकते हैं कि अगर गलती से उसी url को स्टोर कर लिया जाए तो आप क्या करेंगे? आप सेब पर हैं और आप सेब से आए हैं। और आप पिछला स्थान चाहते हैं
यूको सेप

33

यह हम अपने आवेदन में ऐसा करते हैं

def store_location
  session[:return_to] = request.fullpath if request.get? and controller_name != "user_sessions" and controller_name != "sessions"
end

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

इस तरह से आप केवल :return_toसत्र GAM में अंतिम GET अनुरोध को संग्रहीत करते हैं , इसलिए सभी फॉर्म, तब भी जब कई बार POSTed के साथ काम करेंगे :return_to


3
request.request_uriअब उपलब्ध नहीं है, इसलिए मैं request.fullpathइसके बजाय उपयोग करने का सुझाव देता हूं
उर्फ

@ प्रिय अपडेट किया गया। टिप्पणी के लिए धन्यवाद
MBO

2
हाँ, यह बहुत अच्छा है। मैं केवल आम तौर पर andऔर बयानों orमें उपयोग नहीं करने का सुझाव ifदूंगा। उपयोग करें &&और ||इसके बजाय। विवरण यहाँ है
अकिलिस

19

रेल गाइड में निर्देशों के अनुसार, रेल 5 में, आप उपयोग कर सकते हैं:

redirect_back(fallback_location: root_path)

'बैक' स्थान को HTTP_REFERER हेडर से खींचा गया है जो कि ब्राउज़र द्वारा सेट किए जाने की गारंटी नहीं है। यही कारण है कि आपको 'फ़ॉलबैक_लोकेशन' प्रदान करना चाहिए।


यह सुविधा रेल 5 में दिखाई देती है
चमबेउर

@pSkarl यूजर को फ्लैश मैसेज के साथ कुछ गलत हो गया है, यह बताने के लिए मैं स्टेटमेंट के noticeसाथ ऑब्जेक्ट कैसे पास कर सकता हूं redirect_back?
अलेवेंटुराइयो

2
खैर, मैं इसे हल कर सकता है redirect_back(fallback_location: root_path, notice: "Something went wrong!"):। आशा है कि यह किसी तरह मदद कर सकता है
अलेक्सांटुरियो

18

request.referer रैक द्वारा निर्धारित किया गया है और निम्नानुसार सेट किया गया है:

def referer
  @env['HTTP_REFERER'] || '/'
end

बस एक करें redirect_to request.refererऔर यह हमेशा सही रेफ़रिंग पेज या रूट_पैथ ('/') पर रीडायरेक्ट करेगा। यह आवश्यक है जब परीक्षण पास किए जा रहे हों जो किसी विशेष पृष्ठ पर डायरेक्ट-नेवी के मामलों में विफल होते हैं, जिसमें नियंत्रक एक रीडायरेक्ट_टाउन फेंकता है:


निश्चित नहीं है कि आप कौन सी फ़ाइल देख रहे हैं, लेकिन रैक स्रोत पर, यह 28 मार्च 2011 केreferer रूप में परिभाषित किया गया था , और यह है कि इसे आज के रूप में कैसे परिभाषित किया गया है । यही है, परिभाषा का हिस्सा नहीं है। || '/'
maček

1

जो लोग रुचि रखते हैं, उनके लिए यहां मेरा कार्यान्वयन MBO के मूल उत्तर (रेलिंग 4.2.4, रूबी 2.1.5 के खिलाफ लिखा गया) का विस्तार है।

class ApplicationController < ActionController::Base
  after_filter :set_return_to_location

  REDIRECT_CONTROLLER_BLACKLIST = %w(
    sessions
    user_sessions
    ...
    etc.
  )

  ...

  def set_return_to_location
    return unless request.get?
    return unless request.format.html?
    return unless %w(show index edit).include?(params[:action])
    return if REDIRECT_CONTROLLER_BLACKLIST.include?(controller_name)
    session[:return_to] = request.fullpath
  end

  def redirect_back_or_default(default_path = root_path)
    redirect_to(
      session[:return_to].present? && session[:return_to] != request.fullpath ?
        session[:return_to] : default_path
    )
  end
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.