Рейки 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 Guides .
Рейки 3
На жаль, у Rails 3 :key
параметр для 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
блоками, щоб вийняти частину повторення.
EDIT (8 травня 2014 р.): Більш очевидним є те, що відповідь містить інформацію для обох Rails 3 і 4. Оновіть посилання на код, щоб перейти до точних номерів рядків і зобов’язань, щоб вони могли працювати довший період часу.
EDIT (16 листопада 2014 р.): Rails 4 зараз має бути вгорі і містити відповідну інформацію, оскільки це вже поточна версія Rails вже досить давно.
EDIT (9 серпня 2016 р.): Подумайте, що рішення все ще працює в Rails 5, і оновіть застарілі посилання.