Доступ к URL-помощникам в маршрутах. - PullRequest
8 голосов
/ 22 марта 2012

Я хотел бы перенаправить путь в маршрутах, используя следующие строки:

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

, чтобы /privacypolicy.php был перенаправлен на правильную страницу, определенную прямо над ним., он выдает следующую ошибку:

undefined local variable or method `privacy_policy_url'

Так что я предполагаю, что нельзя использовать URL-помощники в rout.rb.Есть ли способ использовать URL-помощники в файле маршрута, и рекомендуется ли это делать?

Ответы [ 3 ]

6 голосов
/ 29 сентября 2016

Я знаю, что немного опоздал, но этот вопрос - один из самых популярных, когда поиск в 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
1 голос
/ 22 марта 2012

URL-помощники создаются из маршрутов.Поэтому они не будут использоваться при рисовании новых маршрутов.

Вам придется использовать подход gayavat.

- или -

Перенаправить с использованием точного URL, например http://guides.rubyonrails.org/routing.html делает.

edit:

Если это больше, чем просто один маршрут "... php", вы можете рассмотреть возможность создания контроллера перенаправления.Посмотрите здесь, как это настроить: http://palexander.posterous.com/provide-valid-301-redirects-using-rails-route

Внутри вашего файла маршрутов, вы должны добавить это внизу, чтобы он не мешал другим маршрутам:

get '/:url' => 'redirect#index'
0 голосов
/ 22 марта 2012

Что-то вроде:

get 'privacypolicy.php' => "privacy_policy#show"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...