Redirect_to'nun doğru şekilde yapılması: yönlendirici mevcut olmadığında Ruby on Rails'e geri dönüyor


93

Ben bir sorun yaşıyorum redirect_to :back. Evet, yönlendirenler.

Sık sık istisna yaşarım

(ActionController :: RedirectBackError) "Bu eyleme yönelik istekte HTTP_REFERER ayarlanmadı, bu nedenle redirect_to: back başarıyla çağrılamadı. Bu bir testse, request.env [\" HTTP_REFERER \ "] belirlediğinizden emin olun."

Bunun bir yönlendirenin müsait olmamasının bir sonucu olduğunu anlıyorum. Örneğin, ziyaret edilen son sayfayla her erişimde bir oturum değişkeni ayarlamanın ve HTTP_REFERER kullanılamadığında, yönlendirmek için bu oturum değişkenini kullanmanın bir yolu var mı?


Bir güncelleme eyleminde aynı hatayı görüyorum, bu garip çünkü yönlendiren boş olamaz (istek bir formdan olabilir), ancak bazı kullanıcılar bunu nasıl yaptığını bilmediğim şekilde yapmayı başardı.
lulalala

Yanıtlar:


146

Olası değildir yapmak bir oturumu var ve yok bir yönlendiren var.

Bir yönlendirenin ayarlanmadığı durum o kadar da nadir değildir ve genellikle bu beklentiyi kurtarırım:

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

Bunu sık sık yaparsanız (ki bu kötü bir fikirdir) Maran'ın önerdiği gibi başka bir yönteme sarabilirsiniz.

BTW Bence bu kötü bir fikir çünkü bu, kullanıcı akışını belirsiz hale getiriyor. Sadece oturum açma durumunda bu mantıklıdır.

GÜNCELLEME : Birkaç kişinin artık bunun Rails 5 ile çalışmadığını belirttiği gibi redirect_back, bunun yerine , bu yöntem bir geri dönüşü de destekler. Kod daha sonra şu hale gelir:

def some_method
  redirect_back fallback_location: root_path
end

4
Bunun yerine rescue_from kullanmak için bunu değiştireceğimden şüpheleniyorum.
Bob Aman

1
@BobAman IMO Kullanabileceğimiz rescue_fromkontrolör birden olsaydıredirect_to :back
Theo B

rails 5 ile çalışmaz, ActionController :: RedirectBackError tanımsızdır ... hangi çözüm?
Matrix

Bunun yerine şunu kullanın:redirect_to (request.referrer || root_url)
Abhi

38
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

Bunu dene! ( Authlogic eklentisi sayesinde)


22
Bu iyi bir çözüm, ancak onu kullanan herkesin, uygulamanıza göz atmak için birden çok sekme kullanması durumunda kullanıcı için son derece kafa karıştırıcı bir şekilde "bozulabileceğini" akılda tutmasını tavsiye ederim.
Mitch Lindgren

3
+1 Soruyu yanıtlamak ve tasarım yöntemlerini eleştirmemek için.
Abe Petrillo

38

İşte benim küçük redirect_to_back yöntemim:

  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 boşsa, başka bir yere gitmek için isteğe bağlı bir url iletebilirsiniz.


32

Temel özellik

redirect_backRails 5+ temel bir özelliktir ActionController::Redirecting, zaten dahil olan modülde mevcuttur ApplicationController::Base.

KULLANMAZLIK UYARISI: redirect_to :backkullanımdan kaldırıldı ve Rails 5.1'den kaldırılacak. Kullanın redirect_back(fallback_location: fallback_location)nerede fallback_locationisteği hiçbir HTTP referer bilgi varsa kullanımına konumunu temsil eder.

EDIT: kaynak


Kaynağa bağlantı lütfen
Chris Bloom

1
@ Chrisbloom7 Bu, Rails 5.0.0beta3 ile çalışırken aldığım bir uyarı mesajıdır redirect_to :back.
Cyril Duchon-Doris

21

Belki geç olmuştur, ancak seçenekleri de koruyan yöntemimi paylaşmak istiyorum:

  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

Bunu şu şekilde kullanabilirsiniz:

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

15

güncellenmiş: Rails 5, redirect_back yöntemini ekledi ( https://github.com/rails/rails/pull/22506/ ), daha iyi kullanın:

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

5.0'dan düşük raylar için hala aşağıdaki eski yöntemi kullanabilirsiniz:

@ troex'in cevabına benzer şekilde, bunu uygulama denetleyicinize ekleyin

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

sonra kontrol cihazınızda kullanın

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

0

Son zamanlarda, yeniden yönlendirmem :backveya belirli bir sayfaya yönlendirmem gereken aynı sorunla karşılaştım . Çok fazla çözüme gittikten sonra, sonunda bunu basit buldum ve sorunu çözüyor gibi görünüyor:


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

sessionAyrıntıları kullanmak istiyorsanız , bunu kodun başka bölümünde yapın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.