маршруты рельсов и настраиваемая маршрутизация для вложенного ресурса

Для нескольких проектов мне нужно что-то упростить мои маршруты, чтобы удалить имя контроллера для одного из самых важных маршрутов. В этом случае editions, поэтому вместо

domain.com/editions/london/venues/the-venue

Мы используем ->

domain.com/london/venues/the-venue

Я использовал эту формулу для своей маршрутизации:

  # MUST BE LAST
  resources :editions, path: '' do
    get 'set_session', on: :member
    resources :events
    resources :quiz_masters
    resources :venues
  end

И работает нормально, но чувствую в этом что-то неприятное. Мне интересно, есть ли лучшая альтернатива, которая также имеет ограничения, поэтому мне не нужно беспокоиться о том, чтобы всегда оставлять ее внизу моих маршрутов.

Я также не уверен, что path: '' хороший способ сделать это? Хотя это работает.


person ere    schedule 02.07.2014    source источник
comment
например, я мог как-то ограничить это с помощью :constraints => proc { |req| Edition.all.map(&:slug).include?(req.params[:edition_id]) }?   -  person ere    schedule 02.07.2014
comment
Это то, над чем мы тоже боролись - лучшее решение, которое у нас есть, - это то, что вы задали в своем вопросе, если у вас есть единственный случай, когда вы хотите использовать определение ресурса в самих маршрутах.   -  person Richard Peck    schedule 02.07.2014
comment
Да, это просто немного похоже на взлом. С одной стороны, мне не нравится открывать все маршруты с помощью path: с другой стороны, мне не нравится идея наложения ограничений на мои маршруты, которые должны касаться БД! ГРЯЗНЫЙ!   -  person ere    schedule 02.07.2014
comment
Пишу ответ за вас. Не сильно вам поможет, но кое-что объяснит   -  person Richard Peck    schedule 02.07.2014


Ответы (3)


Используя ваш пример, вам, вероятно, следует ограничить его. Либо используйте включенный вами массив Edition.all.map (&: slug), либо кешируйте его каким-либо образом в зависимости от размера списка. Таким образом, он будет ограничен и не обязательно должен быть внизу файла маршрутов.

resources :editions, path: '', :constraints => proc { |req| ['london', 'other_cities'].include?(req.params[:edition_id]) } do
  get 'set_session', on: :member
  resources :events
  resources :quiz_masters
  resources :venues
end
person Community    schedule 05.07.2014

Маршруты

Если вы не даете ответов, я подробно расскажу, как мы это делаем, то есть мы делаем то же самое, что вы объяснили в своем вопросе:

#config/routes.rb
... @bottom
resources :events, path: "" do
   resources :venues
   # ...
end

Это работает только для отдельных ресурсов (у вас не может быть более одного path: ''), так как это приведет к конфликту, если у вас будет несколько ссылок. Как вы упомянули, это должно быть внизу ваших маршрутов (даже ниже root). Мы используем эту настройку в настоящее время


Слаги для всего приложения < / а>

Что-то, что вам может пригодиться, - это создать способ обработки слагов в масштабе всего приложения.

Мы этого не сделали, но теоретически с этим можно справиться, используя какое-то промежуточное программное обеспечение / простую модель с полиморфной ассоциацией, чтобы определить, куда направить запрос.

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

#app/models/slug.rb
Class Slug < ActiveRecord::Base
   belongs_to :sluggable, polymorphic: true
end

#slugs table
id | sluggable_id | sluggable_type | created_at | updated_at

Тогда вы можете обрабатывать пули ваших моделей следующим образом:

#app/models/concerns/slugged.rb
Class Slugged
    extend ActiveSupport::Concern

    included do
       has_one :slug, as: :sluggable
       before_save :build_slug
    end
end

Это должно позволить вам затем подбирать ярлыки в некотором slug промежуточном программном обеспечении и направлять их к нужному контроллеру. Может быть, "взломать", но это самый обширный и модульный способ

person Richard Peck    schedule 02.07.2014

Мне кажется, что неудобства возникают из-за необходимости и линейного характера маршрутов и URL-адресов, а не из-за вашего решения. Что-то в этом коде (как и в коде Рича) кажется немного неприятным, как вы говорите, и, возможно, «не в духе Rails»; но Rails предназначен для сгибания, когда это необходимо, и я не могу придумать более эффективного способа выполнить то, что вы делаете.

Если первый термин в маршруте является слагом ("/ london /"), маршрут должен быть определен последним. Я не могу себе представить, как это обойтись, и не думаю, что вам следует терять сон или душевное спокойствие в поисках альтернативы.

Любое интересное приложение будет выходить за рамки того фреймворка, в котором оно написано, а это означает, что всегда будут некоторые неудобные фрагменты кода.

person Topher Hunt    schedule 04.07.2014