Помощь с маршрутами Rails
-
22-08-2019 - |
Вопрос
Скажем, есть ли у меня профиль контроллера, в котором есть всего два действия.Первый из них list
, который просто покажет список имен.Я хочу, чтобы эти имена были ссылками, которые затем переведут вас на страницу с полным профилем.Поэтому мне нужно второе действие, view
, которому затем можно передать параметр, указывающий, какой профиль просматривать.
Например:я бы получил доступ /profile/list
, то, если я захочу просмотреть профиль Джона, я нажму на его имя, и я перейду на /profile/view/john
.Мое действие просмотра прочитает параметр john, а затем сделает соответствующие запросы к базе данных.
Какие изменения мне нужно внести в Routes.rb, чтобы это произошло?Ваше здоровье.
Решение
Я бы предпочел использовать маршрут по умолчанию :controller/:action/:id для защиты от случаев, когда в списке есть два Джона.
Чтобы иметь пользовательский маршрут, как вы упомянули, редактировать ratpes.rb, чтобы включить новый
map.connect ':controller/:action/:user_name'
Теперь запрос вида Profile/view/john должен поступить к вам как
@params = {:controller => "profile", :action=> "view", :user_name => "john"}
Используйте значение params[:user_name], чтобы найти и отобразить соответствующую запись в действии просмотра контроллера.Вы также можете установить некоторые требования к части URL-адреса :user_name, например.он должен соответствовать /SomeRegexpToValidateNames/
map.connect ':controller/:action/:user_name',
:requirements => {:user_name => /\w+/}
Другие советы
если вы хотите идентифицировать профили по имени, например «/profile/view/john», вы можете использовать плагин permalink_fu.
http://www.seoonrails.com/even-better- Looking-urls-with-permalink_fu
что убережет вас от неприятностей в случае дублирования имен...
Если модель «пользовательская», вам необходимо переопределить метод to_param.Это позволит вам вернуть «id-имя» пользователя вместо «id».(бывший:/профиль/просмотр/23-джон)
Я знаю, это не совсем то, о чем вы просили, но это должно быть простое решение.
class User < ActiveRecord::Base
def to_param
"#{id}-#{name.gsub(/\W/, '-').downcase}"
end
end
И просто добавьте простое объявление ресурса в конфигурацию маршрутизации:
map.resources :users