[ruby-on-rails] 리퍼러를 사용할 수 없을 때 Ruby on Rails에서 redirect_to : back을 올바르게 수행합니다.

에 문제가 redirect_to :back있습니다. 예, 리퍼러입니다.

나는 종종 예외를 받는다

(ActionController :: RedirectBackError) “이 작업에 대한 요청에 HTTP_REFERER가 설정되지 않았으므로 redirect_to : back을 성공적으로 호출 할 수 없습니다. 테스트 인 경우 request.env [\”HTTP_REFERER \ “]를 지정해야합니다.”

이것이 리퍼러를 사용할 수 없기 때문이라는 것을 알고 있습니다. 예를 들어 마지막으로 방문한 페이지가있는 각 액세스에 세션 변수를 설정하고 HTTP_REFERER를 사용할 수없는 경우이 세션 변수를 사용하여 리디렉션 할 수있는 방법이 있습니까?



답변

당신이 가능성은 세션을 가지고 하지 않는 리퍼러가 있습니다.

리퍼러가 설정되지 않은 상황은 드물지 않으며 일반적으로 그 기대를 구합니다.

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

이 작업을 자주 수행하면 (나쁜 생각이라고 생각합니다) Maran이 제안한 것과 같은 다른 방법으로 포장 할 수 있습니다.

BTW 이것은 사용자 흐름을 모호하게 만들기 때문에 나쁜 생각이라고 생각합니다. 로그인의 경우에만 이것이 합리적입니다.

업데이트 : 여러 사람들이 더 이상 Rails 5에서 작동하지 않는다고 지적 했듯이을 사용하십시오 redirect_back.이 방법은 폴 백도 지원합니다. 그러면 코드는 다음과 같습니다.

def some_method
  redirect_back fallback_location: root_path
end


답변

내 작은 redirect_to_back 메서드는 다음과 같습니다.

  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을 전달할 수 있습니다.


답변

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

시도해보세요! ( Authlogic 플러그인 덕분에 )


답변

핵심 기능

redirect_back는 Rails 5+의 핵심 기능이며 .NET ActionController::Redirecting에 이미 포함 된 모듈 에서 사용할 수 있습니다 ApplicationController::Base.

DEPRECATION WARNING : redirect_to :back더 이상 사용되지 않으며 Rails 5.1에서 제거됩니다. 사용하십시오 redirect_back(fallback_location: fallback_location)fallback_location요청이없는 HTTP 리퍼러 정보가없는 경우에 사용하는 위치를 나타냅니다.

편집 : 소스


답변

늦었을 수도 있지만 옵션을 보존하는 방법을 공유하고 싶습니다.

  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)


답변

업데이트 : Rails 5는 redirect_back 메서드 ( https://github.com/rails/rails/pull/22506/ )를 추가했습니다 .

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

5.0보다 낮은 레일의 경우 아래의 이전 방식을 계속 사용할 수 있습니다.

@troex의 답변과 유사하게 애플리케이션 컨트롤러에 추가하십시오.

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')}


답변

최근에 리디렉션 :back하거나 특정 페이지 로 이동해야하는 동일한 문제가 발생했습니다 . 많은 해결책을 찾은 후 마침내 이것이 간단하고 문제를 해결하는 것처럼 보입니다.


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

session세부 정보 를 사용 하려면 코드의 else 부분에서 수행하십시오.