LoginSignup
1
0

More than 1 year has passed since last update.

Railsで遷移元のコントローラーとアクションを取得する時No Route Matchエラーが発生

Posted at

遷移元のコントローラーとアクションを取得する↓

実装コード:

  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エラーが発生されます。

参考:
https://api.rubyonrails.org/v4.2.0/classes/ActionDispatch/Routing/RouteSet.html#method-i-recognize_path

解決方法:
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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0