[ruby-on-rails] Ruby On Rails에서 이전 페이지로 리디렉션하는 방법은 무엇입니까?
정렬 가능한 헤더와 페이지 매김이있는 모든 프로젝트를 나열하는 페이지가 있습니다.
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을 처음 사용합니다.
답변
편집 조치에서 요청 URL을 세션 해시에 저장하십시오. 세션 해시는 여러 요청에서 사용 가능합니다.
session[:return_to] ||= request.referer
그런 다음 성공적으로 저장 한 후 업데이트 작업에서 해당 경로로 리디렉션하십시오.
redirect_to session.delete(:return_to)
답변
왜 redirect_to(:back)
당신을 위해 작동 하지 않습니다, 왜 안돼?
redirect_to(:back)
나를 위해 매력처럼 작동합니다. 그것은 단지 지름길입니다.
redirect_to(request.env['HTTP_REFERER'])
http://apidock.com/rails/ActionController/Base/redirect_to(pre Rails 3) 또는 http://apidock.com/rails/ActionController/Redirecting/redirect_to(Rails 3)
참고 redirect_to(:back)
5. 사용할 수있는 레일에 사용되지됩니다
redirect_back(fallback_location: 'something')
대신 ( http://blog.bigbinary.com/2016/02/29/rails-5-improves-redirect_to_back-with-redirect-back.html 참조 )
답변
한 가지 예외를 제외하고 Jaime의 방법이 마음에 들었습니다. 매번 참조자를 다시 저장하는 것이 좋습니다.
def edit
session[:return_to] = request.referer
...
여러 객체를 편집하는 경우 항상 Jaime의 방법으로 세션에 저장 한 첫 번째 URL로 다시 리디렉션되기 때문입니다. 예를 들어, Apple과 Orange 객체가 있다고 가정 해 봅시다. Apple을 편집하고 session[:return_to]
해당 조치의 참조 자로 설정됩니다. 동일한 코드를 사용하여 오렌지를 편집 session[:return_to]
하려고하면 이미 정의되어 있으므로 설정되지 않습니다. Orange를 업데이트하면 이전 Apple # edit 액션의 리퍼러에게 보내질 것입니다.
답변
이것이 우리가 응용 프로그램에서하는 방법입니다
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
세션 매개 변수 에 마지막 GET 요청 만 저장 하므로 POST 된 여러 시간이 있더라도 모든 양식을 사용할 수 있습니다 :return_to
.
답변
Rails Guides의 지침에 따라 Rails 5에서 다음을 사용할 수 있습니다.
redirect_back(fallback_location: root_path)
‘뒤로’위치는 HTTP_REFERER 헤더에서 가져와 브라우저에서 설정하지 않을 수 있습니다. 따라서 ‘fallback_location’을 제공해야합니다.
답변
request.referer
랙으로 설정되며 다음과 같이 설정됩니다.
def referer
@env['HTTP_REFERER'] || '/'
end
그냥 a를 수행 redirect_to request.referer
하면 항상 실제 참조 페이지 또는 root_path ( ‘/’)로 리디렉션됩니다. 이는 컨트롤러가 redirect_to : back을 던지는 특정 페이지로 직접 탐색하는 경우 실패한 테스트를 전달할 때 필수적입니다.
답변
관심있는 사람들을 위해 MBO의 원래 답변을 확장하는 구현이 있습니다 (rails 4.2.4, ruby 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