friendly_id / content_url без контекста - PullRequest
2 голосов
/ 26 февраля 2010
class Content < ActiveRecord::Base
  has_friendly_id :title, :use_slug => true
end

Как сделать ссылку типа / about-us вместо / contents / about-us?

Должен ли я изменить метод content_url или есть лучший подход?

Ответы [ 2 ]

3 голосов
/ 01 марта 2010

Я только что сделал это для сайта, над которым я работаю.

Это на самом деле вопрос определения правильных маршрутов.

Поскольку ваша модель называется Контентом, я предполагаю, что вы уже отобразили Контент как ресурс, подобный этому (в вашем rout.rb):

  map.resources :content

Это будет обрабатывать URL как:

http://example.com/content/my-special-content-page

Для работы с URL, например:

http://example.com/my-special-content-page

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

map.content '/:id', :controller => 'content', :action => 'show'

Примечание:

Маршруты работают сверху вниз, поэтому вам нужно будет указать это ниже большинства вещей. Особенно:

map.root :controller => "welcome"

Если вы поставите новый маршрут выше этого, вы получите ошибку, потому что он попытается вызвать действие Controller.show с: id из nil.

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

= link_to "My Special Page", content_path(@content)
0 голосов
/ 26 февраля 2010

ОК, повторите этот ответ. Я посмотрел на это немного больше, включая плагин has_friendly_id, кажется хорошим, но я не использовал это раньше. В прошлом я использовал свои собственные методы создания дружественных URL.

Я думаю, что теперь я понимаю, что вы просите ... каждый заголовок в вашей таблице содержания, вам нужен дружественный URL, и вы хотите, чтобы этот URL начинался с / (root), а не /content. Я не вижу немедленного способа сделать это с friendly_id, но это нормально, routs.rb делает это довольно легко.

Измените route.rb, чтобы сделать content вашим root:

map.root :controller => 'content'

Я думаю, что можно сделать несколько вызовов map.root, это зависит только от порядка, если есть коллизии. Если нет, то это просто псевдоним для

map.connect '', :controller => 'content'

Удачи!

...