条件によって更新後の遷移先ページを変える

編集画面への導線が二通りあって、編集後は編集前のページに戻るようにして欲しい!というリクエストがあったので対応した。

  • A画面 → 編集画面(edit,update) → A画面
  • B画面 → 編集画面(edit,update) → B画面

こんな感じ。

下記のような対処をした。

def edit
  if request.referer.include?("B画面のURLで一意性のある文字列") then
    @back_to = request.referer
  end
end

def editで遷移元(request.referer)を判定し、@back_toにURLを格納

<%= f.hidden_field :back_to, :value => @back_to %>

_form.html.erbにhidden_fieldとして@back_toをセット。これによりdef updateに渡すparamsの中にback_toが入る。

def update
  if params["sample"]["back_to"].blank?
    format.html { redirect_to A画面のパス, notice: 'A画面に戻ります' }
  else
    format.html { redirect_to params["sample"]["back_to"], notice: 'B画面に戻ります' }
  end
end

paramsにback_toの条件でredirect_toを分ける。

もっとイカした方法あるかなぁ。