redirect_to_next 패턴 개요
redirect_to_next 패턴은 redirect_back과 유사하게 동작하지만, 리다이렉션 위치를 params[:next] 파라미터에서 가져온다는 점에서 차이가 있습니다. 이 패턴은 특히 여러 곳에서 호출될 수 있는 범용적인 액션의 후처리 경로를 동적으로 결정해야 할 때 유용합니다.
RedirectToNext 모듈 구현
다음은 이 패턴을 구현하기 위한 RedirectToNext 모듈의 코드입니다. 이 모듈은 ActiveSupport::Concern을 사용하여 컨트롤러에 쉽게 포함될 수 있도록 설계되었습니다.
```ruby module RedirectToNext extend ActiveSupport::Concern
def redirect_to_next(fallback_location:, **args) return redirect_to fallback_location, **args unless next_path redirect_to params[:next], **args end
def next_path return nil unless params[:next]&.start_with?(“/”) params[:next] end end ```
-
redirect_to_next메서드는params[:next]에 유효한 경로가 있을 경우 해당 경로로 리다이렉션하고, 없을 경우fallback_location으로 리다이렉션합니다. -
next_path메서드는params[:next]값이/로 시작하는지 확인하여 잠재적인 보안 위험(다른 호스트로의 리다이렉션 방지)을 방지합니다. Rails는 기본적으로 다른 호스트로의 리다이렉션을 막지만, 명시적인 검증은 좋은 습관입니다. -
**args는redirect_to메서드에 전달될 수 있는 모든 추가 인자(예:notice,alert)를 그대로 전달합니다.
컨트롤러 및 뷰에서의 사용
이 모듈은 ApplicationController에 포함되어 모든 컨트롤러에서 사용할 수 있습니다.
```ruby # app/controllers/application_controller.rb class ApplicationController < ActionController::Base include RedirectToNext
# in a controller def create # … (데이터 생성 로직) redirect_to_next(fallback_location: whatever_path, notice: “Created a thing”) end end ```
뷰에서는 폼을 통해 params[:next]를 전달할 수 있습니다. hidden_field_tag를 사용하면 사용자에게 보이지 않게 다음 경로를 지정할 수 있습니다.
erb
<%= form_with model: @widget do |f| %>
<%= hidden_field_tag :next, whatever_path %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.submit %>
<% end %>
이처럼 params[:next]를 통해 다음 경로를 명시적으로 전달함으로써, 하나의 액션이 완료된 후 호출자의 요구에 따라 다양한 리다이렉션 동작을 수행할 수 있게 됩니다. 이는 특히 재사용 가능한 컴포넌트나 공유된 액션에서 코드의 유연성과 유지보수성을 크게 향상시킵니다.