Переопределение именованных параметров маршрута
Вы можете использовать опцию param
при определении ресурсов для переопределения идентификатора ресурса по умолчанию. Чтобы иметь разные идентификаторы в зависимости от маршрута, вы можете использовать опции only
и except
, чтобы указать, какие маршруты включать или исключать соответственно.
Вам нужно будет создать блок resources
для каждого идентификатора. Затем вы можете определить, какие маршруты принадлежат какому идентификатору.
Чтобы обновить метод to_param
для генерации URL, вам нужно будет указать, в каком действии вы находитесь, и, следовательно, какой идентификатор использовать. Есть много способов сделать это. Вы можете добавить attr_writer :to_param_flag
к вашей модели User и установить его в обратном вызове before_action
на контроллере. Вы можете сохранить состояние logged_in в User. И есть много других решений, с которыми вы можете поэкспериментировать, чтобы найти то, что лучше всего подходит вашему проекту.
Обновление:
Вы можете определить маршрут несколькими способами. Поскольку существует только один маршрут, вместо использования ресурсов мы можем использовать match. В документации по и ActionDispatch::Routing::Mapper::Base#match
и комментариях мы можем видеть опции (включая :param
), которые мы можем использовать в match
.
Поэтому мы можем сделать:
resources :orders do
match :order_confirmation, on: :member, param: :order_token, via: :get
end
и поскольку get
является псевдонимом для match...via: :get
, мы можем сделать:
resources :orders do
get :order_confirmation, on: :member, param: :order_token
end
Теперь маршрутизация будет осуществляться через /orders/order_confirmation/:order_token
, и у контроллера будет доступ к params[:order_token]
.