Удалите имя контроллера из URL в Rails 3 и используйте пользовательскую строку вместо id - PullRequest
0 голосов
/ 23 марта 2012

С самого начала я всегда сталкиваюсь с этой проблемой с рельсами, короткими URL-адресами без имени контроллера.

Например, у меня есть блог, и я не хочу указывать даты или имена контроллеров в URL, у меня уже есть модель страницы с уникальным полем url в моей базе данных. Rails отлично работает с такими URL:

jeena.net/pages/1

И когда я изменяю модель, я даже могу заставить ее использовать

jeena.net/pages/foo

Но, кажется, не имеет значения, что я делаю, я не могу заставить его работать просто:

jeena.net/foo

Конечно, я хочу, чтобы страница индекса все еще работала с

jeena.net/pages

И я хочу, чтобы создание новых страниц и обновление старых страниц также работало в некоторых методах link_to (). Все предложения приветствуются.

1 Ответ

2 голосов
/ 23 марта 2012

Чтобы определить этот маршрут, попробуйте добавить следующее в ваш route.rb:

match '/:id' => 'your_controller#your_action'

Это будет в значительной степени соответствовать всему идентификатору вашей модели. И это не очень хорошо ... Вы не хотите направлять youe_host / pages в контроллер страниц с идентификатором, равным 'pages' ... Чтобы этого не происходило, обязательно поставьте эту строку в конце файл route.rb. Маршрутизатор использует первый маршрут, который соответствует полученному пути, поэтому, поместив эту строку в конец, вы убедитесь, что он будет соответствовать вашему маршруту только после того, как у него закончатся другие значимые параметры.

Лучше было бы передать ограничения regexp маршрутизатору, чтобы он сопоставлял идентификаторы только с определенным форматом, например:

match '/:id' => 'your_controller#your_action', :constraints => { :id => /your_regexp/ }

Обратитесь к руководствам, если у вас есть сомнения по поводу системы прокладки рельсов. Это довольно хорошо написано и охватывает много важных вещей.

Рельсовая маршрутизация - Официальные руководства

edit: чтобы создать именованный маршрут, который вы можете вызывать в своих контроллерах и переопределить обычные маршруты, которые вы, вероятно, создаете с помощью resource, вы должны предоставить параметр :as => в ваш rout.rb

match '/:id' => 'your_controller#your_action', :as => some_name

Тогда вы сможете вызывать его в вашем контроллере / представлениях так:

link_to some_name_path(@my_string_id)

Надеюсь, это поможет. И найдите время, чтобы прочитать руководства, в нем действительно много полезной информации, включая более подробную информацию о создании именованных маршрутов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...