রুবি অন রেলগুলিতে কীভাবে আগের পৃষ্ঠায় পুনর্নির্দেশ করবেন?


186

আমার একটি পৃষ্ঠা রয়েছে যা সমস্ত প্রজেক্টের তালিকাভুক্ত করে যা বাছাইযোগ্য শিরোনাম এবং পৃষ্ঠাবদ্ধকরণ রয়েছে।

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

আমি প্রকল্পগুলির মধ্যে একটি সম্পাদনা করতে পছন্দ করি

path:
projects/436/edit

আমি যখন সেই পৃষ্ঠাতে সংরক্ষণ ক্লিক করি, তখন এটি প্রকল্পগুলি নিয়ন্ত্রণকারী / আপডেট পদ্ধতি কল করে। আমি কোড আপডেট করার পরে আমি একটি নির্দিষ্ট প্রকল্প সম্পাদনার জন্য ক্লিক করার আগে আমি যে পথে ছিলাম সেই পথে পুনঃনির্দেশ করতে চাই। অন্য কথায়, আমি একই বাছাইয়ের সাথে একই পৃষ্ঠায় থাকতে চাই।

আমি লিঙ্ক_ টু (: ফিরে) দেখেছি এবং ভেবেছিলাম: পিছনে 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)আপডেট ক্রিয়াতে পরামর্শ দেব । এটি অধিবেশন থেকে মানটি পরিষ্কার করে, কারণ এটির আর দরকার নেই needed
স্টিগি

19
বেশ কয়েকটি ট্যাব খোলা থাকলে এই যুক্তিটি বিভ্রান্ত হয় না?
জোনস

12
তুমি কি ঠিক পারছো না redirect_to request.referer?
এলে মুন্ডি 16 '

1
@ ড্যানমুন্ডি না, এটির কাজ করার জন্য এটি করা উচিত 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)রেল ৫ এ অবমাননিত হচ্ছে আপনি ব্যবহার করতে পারেন

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
এক্স-ইউরি

হ্যাঁ। redirect_back
কড়া

@ স্ট্রিজওয়াল্ড "ভাল কাজ করে না" এর অর্থ কী? কোন বিবরণ?
পাস্কাল

@ পাসকালবেটজ, আমার অর্থ হ'ল যদি HTTP_REFERERসেট না করা থাকে তবে আপনি পেতে পারেন ActionController::RedirectBackError, সেই ক্ষেত্রে আপনাকে এই ব্যতিক্রম থেকে উদ্ধার করতে হবে। আমার বোঝার হতে, redirect_backকোনো ব্যতিক্রম হ্যান্ডলিং প্রয়োজন হয় না, যেহেতু আপনি প্রদান করতে বাধ্য fallback_location। সম্ভবত 'ভাল কাজ করে না' এটি লাগানোর সঠিক উপায় নয়।
স্ট্রাজওয়াল্ড

45

আমি এক ব্যতিক্রমের সাথে জাইমের পদ্ধতিটি পছন্দ করি, প্রতিবারই রেফারারটিকে পুনরায় সঞ্চয় করা আমার পক্ষে আরও ভাল কাজ করেছে:

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

কারণটি হ'ল আপনি যদি একাধিক বস্তু সম্পাদনা করেন তবে আপনাকে সর্বদা জাইমের পদ্ধতিতে সেশনে সংরক্ষণ করা প্রথম ইউআরএলটিতে ফিরে যেতে হবে। উদাহরণস্বরূপ, ধরা যাক আমার কাছে অ্যাপল এবং কমলা জিনিস রয়েছে। আমি অ্যাপল সম্পাদনা করি এবং session[:return_to]সেই ক্রিয়াটির রেফারারে সেট হয়ে যাই । আমি যখন একই কোডটি ব্যবহার করে কমলা সম্পাদনা করতে যাই তখন session[:return_to]সেট হবে না কারণ এটি ইতিমধ্যে সংজ্ঞায়িত is সুতরাং আমি যখন কমলা আপডেট করব তখন আমি পূর্ববর্তী অ্যাপল # সম্পাদনা ক্রিয়াকলাপের রেফারারে প্রেরণ করব।


হ্যাঁ, তবে আপনি কী পরামর্শ দিতে পারেন যদি দুর্ঘটনাক্রমে একই ইউআরএলটি আপনি যেমন সংরক্ষণ করেন তবে কী করবেন? আপনি আপেল এবং আপনি আপেল থেকে এসেছেন। এবং আপনি পূর্ববর্তী অবস্থানটি চান
ইউকো

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সেশন প্যারামে কেবল সর্বশেষ জিইটি অনুরোধ সংরক্ষণ করবেন , সুতরাং সমস্ত ফর্মগুলি, এমনকি একাধিক সময় পোস্টেড যখন কাজ করবে তখন :return_to


3
request.request_uriআর উপলভ্য নয়, সুতরাং আমি request.fullpathপরিবর্তে এটি ব্যবহার করার পরামর্শ দিই
anka

@ অ্যাঙ্কা আপডেট হয়েছে। মন্তব্যের জন্য ধন্যবাদ
এমবিও

2
হ্যাঁ এটা বেশ ভাল। আমি শুধু সাধারণভাবে ব্যবহার না করার সুপারিশ করবে andএবং orifবিবৃতি। ব্যবহার করুন &&এবং ||পরিবর্তে। বিশদ এখানে
অ্যাকিলিস

19

রেল 5 তে, রেল গাইডের নির্দেশাবলী অনুসারে আপনি ব্যবহার করতে পারেন:

redirect_back(fallback_location: root_path)

'পিছনে' অবস্থানটি HTTP_REFERER শিরোলেখ থেকে টানা হয় যা ব্রাউজার দ্বারা সেট করার নিশ্চয়তা দেয় না। আপনাকে কেন 'ফ্যালব্যাক_লোকেশন' সরবরাহ করা উচিত তা ঠিক।


এই বৈশিষ্ট্যটি রেল 5 এ প্রদর্শিত হবে
চাম্বের

@ পিএসকারল কীভাবে কোনও ফ্ল্যাশ বার্তায় কিছু ভুল হয়েছে তা ব্যবহারকারীকে বলতে আমি কীভাবে বিবৃতিটি noticeদিয়ে একটি বিষয় পাস করতে পারি redirect_back?
alexventuraio

2
আচ্ছা, আমি করে এই সমস্যার সমাধানের পারে: redirect_back(fallback_location: root_path, notice: "Something went wrong!")। আশা করি এটি কোনওভাবে সাহায্য করতে পারে।
alexventuraio

18

request.referer র্যাক দ্বারা সেট এবং নীচে সেট করা হয়:

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

কেবল একটি করুন redirect_to request.refererএবং এটি সর্বদা সত্য উল্লেখযোগ্য পৃষ্ঠায় বা মূল_পথ ('/') এ পুনঃনির্দেশিত হবে। কোনও নির্দিষ্ট পৃষ্ঠায় সরাসরি-নাভির ক্ষেত্রে ব্যর্থ হওয়া পরীক্ষাগুলি পাস করার সময় এটি অপরিহার্য যেখানে নিয়ামক একটি redirect_to: পিছনে নিক্ষেপ করে


আপনি কোন ফাইলটি দেখছিলেন তা নিশ্চিত নয় তবে র্যাক উত্সে, এটিই ২৮ শে মার্চ ২০১১referer হিসাবে সংজ্ঞায়িত হয়েছিল এবং এটি আজকের হিসাবে এটিই সংজ্ঞায়িত হয় । যে, সংজ্ঞা অংশ নয়। || '/'
maček

1

যারা আগ্রহী তাদের জন্য, এখানে আমার বাস্তবায়নটি এমবিওর আসল উত্তরটি প্রসারিত করছে (রেল ৪.২.৪, রুবি ২.১.৫ এর বিপরীতে লিখিত)।

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