Rails маршрутизация - пользовательские маршруты для ресурсов - PullRequest
6 голосов
/ 15 февраля 2010

В настоящее время я создаю одно приложение Rails, и я хотел бы придерживаться всех этих модных вещей, таких как REST и Ресурсы, но я бы хотел немного настроить свои маршруты. Я хочу, чтобы мой маршрут GET был немного более многословным - создаваемое мной приложение представляет собой простой блог, поэтому вместо GET /posts/1 я бы предпочел что-то вроде GET /posts/1-my-first-post.

Есть идеи, как это сделать? Ничего не нашел в сети.

Ответы [ 5 ]

16 голосов
/ 15 февраля 2010

Маршруты:

map.resources :posts

Модель:

class Post < ActiveRecord::Base
  def to_param
    "#{id.to_s}-#{slug}"
  end
end

Нужно сделать свое дело.

Кстати: http://railscasts.com/episodes/63-model-name-in-url

4 голосов
/ 15 февраля 2010

Определите метод to_param в вашей модели, и все помощники по URL будут использовать то, что вы возвращаете этим методом, например ::10000

class Post < ActiveRecord::Base
  der to_param
    slug
  end
end

Вам также нужно будет адаптировать свои контроллеры для этого. Заменить:

Post.find(params[:id])

с:

Post.find_by_slug(params[:id])

Также обратите внимание, что метод find вызывает исключение ActiveRecord :: RecordNotFound, когда запись не может быть найдена во время использования метода find_by_ *. Исключения не создаются, поэтому вам нужно проверить это вручную.

2 голосов
/ 16 февраля 2010

Вы можете найти плагин friendly_id полезным, поскольку он также будет обрабатывать перенаправления, если вы переименуете свои слагы (таким образом, seo friendly), обрабатывает конфликты имен и легко интегрируется с методом find, поэтому вам не нужно коснитесь методов вашего контроллера (кроме перенаправления).

0 голосов
/ 16 февраля 2010

С другой стороны ...

Добавьте такой метод к post.rb

def path
  "/posts/#{id}-#{slug}"
end

Тогда используйте следующее в ваших представлениях:

0 голосов
/ 16 февраля 2010

С другой стороны ...

Добавьте такой метод к application_helper.rb

def permalink(post)
  "#{post_path(post)}-#{post.slug}"
end

Затем используйте следующее в ваших представлениях (используя permalink(@post) вместо post_path)

<%= link_to @post.title, permalink(@post) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...