2015-10-21 29 views
6

Tôi muốn biết tuyến đường của yêu cầu api là gì.Tìm tuyến đường dẫn từ chuỗi url

Hãy nói ví dụ api_v1_user_session _path là con đường cho /api/v1/users/sign_in url

Nếu một yêu cầu đến từ /api/v1/users/sign_in Làm thế nào tôi có thể tìm ra con đường là gì. Trong trường hợp này, nó phải là api_v1_user_session _path

Tôi đã thử tuyên bố bên dưới nhưng nó đang cấp cho bộ điều khiển và hành động chứ không phải là tuyến đường.

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

Có phương pháp nào như thế này

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

Làm thế nào tôi có thể nhận được tuyến đường này từ url hoặc từ request đối tượng.

+0

Bạn muốn lấy lại phương pháp mà tạo ra con đường? – Swards

+0

Tôi không chắc chắn điều đó có nghĩa là gì, nhưng tôi đang tìm tuyến đường mà chúng tôi nhận được từ các tuyến 'rake'. Tôi sẽ cung cấp cho đầu vào là 'url' từ đối tượng' request' và mong đợi tuyến đầu ra. –

Trả lời

4

Với nhiều tìm kiếm hơn, tôi có thể tự tìm ra nó.

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 

Kết quả:

StringToRoute.new(request).path

+0

Giải pháp tuyệt vời! (Nhiều người nên sẵn sàng để cuộn lên tay áo của họ và đào sâu vào khuôn khổ khi cần thiết.) –

+2

Nên biến nó thành đá quý –

Các vấn đề liên quan