ruby on rails रूबी ऑन रेल में पिछले पृष्ठ पर रीडायरेक्ट कैसे करें?




ruby-on-rails redirect (6)

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

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

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

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

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

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

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 

किसी भी विचार पर मैं इसे कैसे काम कर सकता हूं। ऐसा लगता है कि एक समस्या की तरह आसानी से हल किया जाएगा, लेकिन मैं RoR के लिए नया हूँ।


इस तरह हम इसे अपने आवेदन में करते हैं

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 session param, इसलिए सभी रूपों, भले ही एकाधिक समय पोस्ट किए गए हों :return_to


रुचि रखने वालों के लिए, यहां मेरा कार्यान्वयन एमबीओ के मूल उत्तर (रेल 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

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

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

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


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

redirect_back(fallback_location: root_path)

'बैक' स्थान HTTP_REFERER शीर्षलेख से खींचा जाता है जिसे ब्राउज़र द्वारा सेट करने की गारंटी नहीं है। Thats क्यों आपको 'fallback_location' प्रदान करना चाहिए।


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

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

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





redirect