2015-10-21 9 views
6

私はapiリクエストのルートが何であるか知りたいと思っています。URL文字列からルートパスを見つける

は、要求が、私がルートであるかを調べることができますどのよう/api/v1/users/sign_inから来ている場合は、たとえばapi_v1_user_session _pathが/api/v1/users/sign_in URL

ためのルートであると言うことができます。このシナリオでは、それはする必要がありますapi_v1_user_session _path

私は以下の文を試してみましたが、コントローラとアクションを与えていますが、経路は与えていません。

Rails.application.routes.recognize_path('/api/v1/users/sign_in') 
=> {:controller=>"api/v1/sessions", :action=>"new"} 

私はURLからかrequestオブジェクトからこのルートを取得できます。この

Rails.application.routes.get_route('/api/v1/users/sign_in') 
=> api_v1_user_session 

のような任意の方法があります。

+0

あなたがルートを生成する方法を取り戻すしたいですか? – Swards

+0

私はそれが何を意味するのか分かりませんが、私は 'レーキルート'から得たルートを探しています。私は 'request'オブジェクトから' url'として入力を与え、出力ルートを期待します。 –

答えて

4

さらに検索すると、自分でそれを把握することができました。

class StringToRoute 

    attr_reader :request, :url, :verb 

    def initialize(request) 
    @request = request 
    @url = request.original_fullpath 
    @verb = request.request_method.downcase 
    end 

    def routes 
    Rails.application.routes.routes.to_a 
    end 

    def recognize_path 
    Rails.application.routes.recognize_path(url, method: get_verb) 
    end 

    def process 
    _recognize_path = recognize_path 
    routes.select do |hash| 
     if hash.defaults == _recognize_path 
     hash 
     end 
    end 
    end 

    def get_verb 
    verb.to_sym 
    end 

    def path 
    "#{verb}_#{process.name}" 
    end 
end 

結果:

StringToRoute.new(request).path

+0

すてきな解決策! (もっと多くの人が袖を巻き上げて、必要に応じてフレームワークを掘り下げてください) –

+2

これを宝石にする必要があります –

関連する問題