2009-03-30 4 views
0

Скажите, есть ли у меня контроллер, профиль, который имеет всего два действия. Первый из них - list, который будет просто показывать список имен. Я хочу, чтобы эти имена были ссылками, которые затем перейдут на страницу с полным профилем. Поэтому мне нужно второе действие, view, которое затем может подавать параметр, чтобы указать, какой профиль просматривать.Помощь с маршрутами Rails

Например: Я бы получил доступ к /profile/list, а затем, если я хочу просмотреть профиль Джона, я нажму на его имя, которое должно занять меня до /profile/view/john. Мое действие просмотра будет читать параметр john, а затем выполнить соответствующие запросы к базе данных.

Какие изменения я должен внести в route.rb, чтобы это произошло? Приветствия.

ответ

0

Я предпочел бы использовать по умолчанию: контроллер /: Действие /: маршрут ID для защиты от случаев, когда имеются 2 Джон в списке.

Чтобы иметь собственный маршрут, как вы упомянули редактировать routes.rb включить новый один

map.connect ':controller/:action/:user_name' 

Теперь запрос профилем/просмотр/джон должен достигнуть вас как

@params = {:controller => "profile", :action=> "view", :user_name => "john"} 

использования значение params [: имя_пользователя] для поиска и отображения соответствующей записи в действии вида контроллера. Вы также можете настроить некоторые требования к части: user_name URL-адреса, например. он должен соответствовать/SomeRegexpToValidateNames/

map.connect ':controller/:action/:user_name', 
    :requirements => {:user_name => /\w+/} 
+0

Как изменить map.connect ': controller /: action /: имя_пользователя', чтобы я жестко задавал профиль/просмотр. Потому что меня не волнуют другие вещи, такие как/one/two/three. – alamodey

+0

/one/two/three попытается вызвать действие, называемое two on one_controller. Rails не должны находить это и обрабатывать это с помощью «общей страницы, не найденной». Если вы действительно хотите жестко указать это, вы можете указать более строгие: требования => {: controller =>/profile /,: action =>/view /, ..} – Gishu

-1

Если модель является «пользователем», вы должны переопределить метод to_param. Это позволит вам вернуть «id-name» пользователя вместо «id». (пример:/profile/view/23-john)

Я знаю, это не совсем то, о чем вы просили, но это должно быть легким решением.

class User < ActiveRecord::Base 
    def to_param 
    "#{id}-#{name.gsub(/\W/, '-').downcase}" 
    end 
end 

И просто добавить простое заявление ресурса в конфигурации маршрутизации:

map.resources :users 
0

, если вы хотите, чтобы определить профили по имени, как «/ профиль/просмотр/джон» вы можете использовать permalink_fu плагин

http://www.seoonrails.com/even-better-looking-urls-with-permalink_fu

который будет держать вы из-за проблем, когда есть дублирование имен ...

Смежные вопросы