Рельсы 4 и 5
В Rails 4 :param
была добавлена опция, которая, кажется, делает именно то, что вы ищете. Вы можете сравнить код Rails 3 с кодом Rails 4 .
подробности
Вы можете легко реализовать это в своем routes.rb
файле:
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
Начиная с выпуска Rails 4, эта функциональность задокументирована в руководствах по Rails .
Рельсы 3
К сожалению, в Rails 3 :key
опция for resources
была удалена, поэтому вы больше не можете легко изменить имя для маршрутов, созданных таким образом, просто передав дополнительную опцию.
подробности
Я предполагаю, что вы уже каким-то образом добились того, чтобы приложение работало так, как вы хотите, в прошлом году, но я постараюсь получить эффект, который вы описали в Rails 3, в routes.rb
. Это просто потребует немного больше работы, чем to_param
метод. Вы все еще можете определить пользовательские параметры маршрутов определяются с использованием scope
и match
(или его кузенов get
, put
, post
, и delete
). Вы просто пишете имя параметра, которое хотите в сопоставлении:
get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
Вам придется вручную добавить все маршруты, которые resources
автоматически создаются для вас, но это даст вам то, что вы ищете. Вы также можете эффективно использовать :controller
опцию scope
и дополнительные scope
блоки, чтобы убрать часть повторения.
РЕДАКТИРОВАТЬ (8 мая 2014 г.): сделайте более очевидным ответ, содержащий информацию как для Rails 3, так и для Rails 4. Обновите ссылки на код, чтобы перейти к точным номерам строк и фиксации, чтобы они работали в течение более длительного периода времени.
РЕДАКТИРОВАТЬ (16 ноября 2014 г.): Rails 4 теперь должен быть наверху и включать соответствующую информацию, поскольку это была текущая версия Rails в течение некоторого времени.
РЕДАКТИРОВАТЬ (9 августа 2016 г.): подумайте о том, что решение все еще работает в Rails 5, и обновите устаревшие ссылки.