Я знаю, что немного опоздал, но этот вопрос - один из самых популярных, когда поиск в Google "использует url_helpers in rout.rb", и я сначала нашел его, когда наткнулся на эту проблему, так что я бы хотел бы поделиться своим решением.
Как упомянул @martinjlowm в своем ответе, нельзя использовать URL-помощники, когда рисует новые маршруты. Однако - это один способ определить правило перенаправления маршрута с помощью URL-помощников. Дело в том, что ActionDispatch :: Routing :: Redirection # redirect может принимать блок (или #call
-able), что на позже (когда пользователь попадает в маршрут) вызывается с двумя параметрами, params и request , для возврата нового маршрута, строки. А поскольку маршруты на данный момент правильно прорисованы, вполне допустимо вызывать помощников URL внутри блока!
get 'privacypolicy.php', to: redirect { |_params, _request|
Rails.application.routes.url_helpers.privacy_policy_path
}
Кроме того, мы можем использовать средства метапрограммирования Ruby для добавления сахара:
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