Рельсы 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, и обновите устаревшие ссылки.
param
варианта для рельсов 3: gist.github.com/sj26/44ef47fe8b98b46ee32dpost_slug
, что может сбивать с толку.в Rails 4 передайте параметр param, чтобы изменить параметры: id. Например
resources :photos, param: :photo_name
, сгенерирует / photos /: имя_фотоисточник
Если я правильно вас понял, вы хотите,
client_name
чтобыid
в вашем URL-адресе был вместо , верно?Вы можете сделать это, переопределив
to_param
метод в своей модели. Вы можете получить больше информации здесь .источник
Для этого есть драгоценный камень, как и драгоценный камень для всего;)
Я использовал FriendlyId для такого поведения в rails 3.
Однако вам потребуется добавить код в вашу модель, например:
... и если у ваших клиентов нет имен, совместимых с URI, вы можете использовать для этого slug, с которым вы можете справиться
has_friendly_id :name, :use_slug => true
. Однако при использовании ярлыков вам, очевидно, также необходимо сохранить их в базе данных.И, как уже упоминалось, вы все еще можете использовать
to_param
трюк с rails 3, как описано здесь . Я считаю FriendlyId более универсальным.источник
to_param
, но в фоновом режиме делает и другие умные вещи. Я нашел ссылку здесь: stackoverflow.com/questions/4744446/…to_param
ломает мою интерфейсную часть приложения. На самом деле я отчаянно ищу подход к маршрутизации - мне нужно изменить свой API, но не нарушая часть модели и внешнего интерфейса приложения. Почему я не могу просто изменить маршруты только так, как я сказал, и пример сообщения для более старой версии рельсов выше ???@client = Client.find(:name => param[:client_name]
вClientsController#show
? Это может сработать.Client.where(:name => param[:client_name]).first
, то есть.В Rails 3 вы можете переименовать ключи id, используя такую комбинацию пространств имен и областей видимости (хотя и не очень хорошо):
источник