2012-03-22 29 views
7

Tôi muốn chuyển hướng một con đường ở các tuyến đường bằng cách sử dụng dòng lệnh sau:Tiếp cận những người giúp đỡ URL trong routes.rb

get 'privacy_policy', :controller => :pages, :as => 'privacy_policy' 
get 'privacypolicy.php' => redirect(privacy_policy_url) 

Vì vậy /privacypolicy.php đó được chuyển hướng đến đúng trang được xác định ngay trên nó.

Tuy nhiên, nó ném các lỗi sau:

undefined local variable or method `privacy_policy_url' 

Vì vậy, tôi đoán người ta không thể sử dụng những người giúp đỡ URL trong routes.rb. Có cách nào để sử dụng trình trợ giúp URL trong tệp tuyến đường không và có nên làm như vậy không?

Trả lời

4

Tôi biết tôi m một chút muộn ở đây, nhưng câu hỏi này là một trong những hit hàng đầu khi googling "sử dụng url_helpers trong routes.rb", và tôi ban đầu tìm thấy nó khi tôi đã vấp phải vấn đề này, vì vậy tôi muốn chia sẻ giải pháp của tôi.

Như @martinjlowm được đề cập trong câu trả lời của mình, người ta không thể sử dụng người trợ giúp URL khi vẽ tuyến mới. Tuy nhiên, có một cách để xác định quy tắc chuyển hướng tuyến đường bằng cách sử dụng trình trợ giúp URL. Có điều là, ActionDispatch::Routing::Redirection#redirect có thể mất một khối (hoặc một #call -able), đó là sau (khi người dùng truy cập các tuyến đường) gọi với hai tham số, paramsyêu cầu, để trở về một con đường mới, một chuỗi. Và bởi vì các tuyến đường được vẽ chính xác tại thời điểm đó, nó hoàn toàn hợp lệ để gọi những người trợ giúp URL bên trong khối!

get 'privacypolicy.php', to: redirect { |_params, _request| 
    Rails.application.routes.url_helpers.privacy_policy_path 
} 

Bên cạnh đó, chúng ta có thể sử dụng các cơ sở lập trình meta Ruby để thêm một ít đường:

class UrlHelpersRedirector 
    def self.method_missing(method, *args, **kwargs) # rubocop:disable Style/MethodMissing 
    new(method, args, kwargs) 
    end 

    def initialize(url_helper, args, kwargs) 
    @url_helper = url_helper 
    @args = args 
    @kwargs = kwargs 
    end 

    def call(_params, _request) 
    url_helpers.public_send(@url_helper, *@args, **@kwargs) 
    end 

    private 

    def url_helpers 
    Rails.application.routes.url_helpers 
    end 
end 

# ... 

Rails.application.routes.draw do 
    get 'privacypolicy.php', to: redirect(UrlHelperRedirector.privacy_policy_path)  
end 
+0

Đó là một ý tưởng tuyệt vời, thích nó, cảm ơn! –

0

Cái gì như:

get 'privacypolicy.php' => "privacy_policy#show" 
+0

Đó không phải là một chuyển hướng tuy nhiên, đó là những gì tôi muốn. Tôi cần nó để gửi mã 302. –

+0

bạn có thể trả về 302 dưới dạng trạng thái http: http://blog.futureshock-ed.com/http-status-code-symbols-for-rails làm cho