리퍼러를 사용할 수 없을 때 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)
@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
If you want to use session
details, do it in the else part of the code.
'code' 카테고리의 다른 글
PostgreSQL에서 중복 레코드 삭제 (0) | 2020.09.02 |
---|---|
부트 스트랩 선택 드롭 다운 목록 자리 표시 자 (0) | 2020.09.02 |
응용 프로그램 오류 :이 버전의 응용 프로그램은 시장 청구 용으로 구성되지 않았습니다. (0) | 2020.09.02 |
특정 시간 PHP 후 페이지 리디렉션 (1) | 2020.09.02 |
Request.GetOwinContext를 찾을 수 없습니다. (0) | 2020.09.02 |