Сокращение избыточности в маршрутах Rails и помощника URL - PullRequest
1 голос
/ 27 января 2011

Я хочу добавить название статьи к ее URL-адресу аналогично URL-адресам SO. Мне предложили использовать следующую настройку в ответе на мой другой вопрос

# routes.rb
match '/articles/:id/:title' => 'articles#show', :as => :article_with_title

# articles/index.html.erb
link_to  article.title, article_with_title_path(article, :title => article.title.downcase.gsub(/[^a-z0-9]+/,' ').strip.gsub(/\s+/,'-'))

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

match '/articles/:id/:title' => 'articles#show'
match '/users/:id/:name' => 'users#show'
etc.

Примечания:

  1. В настоящее время хорошо работают следующие маршруты: /article/:id/:action, /article/:id/:title с условием, что статья не может иметь заголовков edit, show, index, etc.
  2. Я считаю, что friendly_id здесь не требуется, поскольку маршруты содержат явно :id.
  3. Как я вижу, SO использует разные маршруты для вопросов /question/:id/:title, /posts/:id/:action и для пользователей /users/:id/:name, /users/:action/:id

Ответы [ 2 ]

1 голос
/ 27 января 2011

Просто переопределите to_param в ваших моделях. Непроверенный пример из памяти:

def to_param
  self.id + "-" + self.name.parameterize
end

этот подход означает, что вам не нужно менять маршрутизатор, а также можете продолжать использовать Model.find(params[:id]) или аналогичный.

В основном то, что делает Railscast, упомянутый в другом ответе, и суть того, что friendly_id делает тоже.

1 голос
/ 27 января 2011

Райан Бейтс сделал превосходную заставку , используя имя модели или любой другой атрибут в URL-адресе вместо идентификатора.

...