Странная маршрутизация - PullRequest
2 голосов
/ 16 июня 2010

Как настроить приложение rails для ответа на такие URL:

http://mydomain.com/white-halogene-lamp

http://mydomain.com/children-lamps

http://mydomain.com/contact-form

первый должен ссылаться на мой контроллер продуктов и показывать мой продукт с таким именем

второй должен ссылаться на мой контроллер категорий и показывать категорию с этим именем

третий должен ссылатьсяна мой контроллер сайтов и покажите сайт с таким названием.

У всех трех моделей (продукт, категория, сайт) есть метод to_seo, предоставляющий упомянутые выше URL (после косой черты)

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

Вопрос в том, как выполнить эту странную маршрутизацию?

Я знаю, что мы перехватили все маршруты, но как я могу указать рельсам использовать разные контроллеры на разных URL в перехвате всего маршрута?Или у Вас есть лучшая идея?

Я бы избегал перенаправлений на другие URL.

Ответы [ 4 ]

3 голосов
/ 16 июня 2010

Это немного странно, особенно если о перенаправлениях не может быть и речи, но одним из способов решения этой проблемы может быть заполнение сопоставления маршрутов из ваших таблиц - route.rb - просто еще один фрагмент кода ruby, так что если вы ставить

map.connect 'children-lamps', :controller => 'category', :action => 'show',  :id => 123

или любым другим способом, который вы определили бы в файле rout.rb, тогда вы также можете поместить

Category.each { |category|
  map.connect category.to_seo, :controller => 'category', :action => 'show', :id => category.id
}

но это будет работать, только если ваши категории / сайты статичны.

1 голос
/ 14 июля 2010

Лучший способ - добавить еще один слой и запустить маршруты следующим образом:

http://yoursite.com/products/white-halogene-lamp

как это можно сделать с помощью:

map.product_seo "prodcuts/:product", :controller => :products, :action => :show

затем в Products # Показать изменение @product=Product.find(params[:id]) на:

@product=Product.find_by_name(params[:product]) if params[:product] #This assumes name is the field you are searching on
@product=Product.find(params[:id]) unless params[:product]

таким образом старые маршруты все еще работают, но вы также получаете URL-адреса SEO.

для категорий просто повторите и при необходимости измените (URL будет / категории / дети-лампы)

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

0 голосов
/ 20 июля 2010

Мне пришлось сделать что-то очень похожее.Вы можете просто настроить общее действие дескриптора как это:

def handle
  @product = Product.find_by_permalink params[:permalink]
  if product
    return render_product
  end

  @category - Category.find_by_permalink
  ..
end

private

def render_product
  # something like this.
  render :file => 'products/show'
end
0 голосов
/ 15 июля 2010

Для этого можно использовать ограничения маршрута.

class ProductExistsConstraint

  def matches?(request)
    Product.exists? :slug => request.path_parameters['slug']
  end

end

и аналогичные классы для категории и страницы.Тогда на маршрутах

match ":slug" => "products#show", :constraints => ProductExistsConstraint.new
match ":slug" => "categories#show", :constraints => CategoryExistsConstraint.new
match ":slug" => "page#show", :constraints => PageExistsConstraint.new

я не проверял это, но я думаю, что это по крайней мере указатель в правильном направлении.Смотрите также здесь: http://guides.rails.info/routing.html#advanced-constraints

...