Rails сопоставляет маршруты с слагами без использования ID в ссылке

В моем файле маршрутов я могу легко собрать совпадение, которое выглядит так и отлично работает.

match '/:slug/:id' => "pages#show", :id => :id

ссылка в представлении, для которого это работает,

link_to n.name, "/" + n.slug + "/" + n.id.to_s

Я бы предпочел не включать идентификационный номер в URL-адрес, поэтому я надеялся сделать что-то вроде

match '/:slug' => "pages#show", :slug => :slug

Но проблема в том, что это не предоставляет идентификатор контроллеру показа страниц. Есть ли способ использовать :slug, чтобы сопоставить его со страницей в базе данных с этим слагом, чтобы найти: id, чтобы я мог передать: id контроллеру?


person mediarts    schedule 06.07.2012    source источник


Ответы (3)


В своих маршрутах используйте это

match "/:slug" => "pages#show"

И в вашем контроллере найдите страницу по слагу, используя это

@page = Page.find_by_slug(params[:slug])
person Chris    schedule 17.12.2012

Взгляните на гем https://github.com/norman/friendly_id, он упрощает маршрутизацию с помощью слагов и много.

person binarycode    schedule 06.07.2012

Вы также можете сделать это:

resources :pages, only: :show, param: :slug

который будет генерировать

страница GET /pages/:slug/(.:format) pages#show

Я хочу, чтобы этот помощник можно было использовать следующим образом: page_path(page), где страница является экземпляром Page, вам также необходимо переопределить метод to_param следующим образом:

def to_param
  slug
end
person Alexander    schedule 29.07.2016