3

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

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: '' - это хороший способ сделать это? Хотя это работает.

+0

например, я мог бы каким-то образом ограничить его: '= constraints => proc {| req | Edition.all.map (&: slug) .include? (Req.params [: edition_id])} '? – ere

+0

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

+0

Да, это просто чувствует немного похоже на хак. С одной стороны, мне не нравится открывать все маршруты с помощью пути: «» с другой стороны мне не нравится идея помещать ограничение на мои маршруты, которые должны касаться БД! DIRTY! – ere

ответ

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 
3

Маршруты

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

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

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


App-Wide Slugs

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

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

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

#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 и направиться к правильному контроллеру. Возможно, «взломать», но это самый обширный способ &

0

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

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

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