遷移元のコントローラーとアクションを取得する↓
実装コード:
def prev_action
actions = route_details_for(request.referer)
return actions[:controller], actions[:action]
end
Getメソッドの場合は、問題なく取れましたが、Getメソッド以外の場合
「 Rails.application.routes.recognize_path」で過去のルートを取得すると、No Route Matchエラーが発生されます。
原因:
path = request.referer
Rails.application.routes.recognize_path(path)
recognize_pathにパラメータとしてpathだけ渡すとメソッドはdefault「GET」になり、No Route matchエラーが発生されます。
解決方法:
Rails.application.routes.recognize_pathを呼び出すときPathかつメソッドもパラメータとして渡せば問題なくPreviousのコントローラーとアクションが取れます。
例:
Rails.application.routes.recognize_path(url, method: method)
修正後コード
def get_prev_action
actions = prev_action
puts "Previous controller : #{actions[:controller]}, Previous action : actions[:action]"
end
def prev_action
methods = [:get, :post, :put, :patch, :delete]
method = methods[0]
retry_count ||= 0
route_details = nil
begin
route_details = Rails.application.routes.recognize_path(request.referer, method: method)
rescue ActionController::RoutingError => e
puts "Routing Error = #{e}"
method = methods[retry_count]
retry unless (retry_count += 1) == 5
else
return route_details
end
end