Как мне перенаправить URL профиля пользователя, чтобы пропустить контроллер? - PullRequest
4 голосов
/ 08 декабря 2009

Прямо сейчас URL моего профиля пользователя выглядят так:

http://example.com/users/joeschmoe

И это указывает на метод show в пользовательском контроллере.

В идеале я хотел бы предложить URL-адреса профиля пользователя, например:

http://example.com/joeschmoe

Итак, какого рода магия маршрутов и контроллеров должна произойти, чтобы осуществить это?

Ответы [ 5 ]

3 голосов
/ 08 декабря 2009

Я не согласен с тем, что jcm говорит по этому поводу. Это совсем не страшная идея и используется в производстве двумя крупнейшими социальными сетями Facebook и MySpace.

Маршрут для соответствия http://example.com/username будет выглядеть следующим образом:

map.connect ':username', :controller => 'users', :action => 'show'

Если вы хотите перейти по маршруту субдомена и сопоставить профили с URL-адресом, подобным http://username.example.com/, я рекомендую использовать плагин SubdomainFu, и полученный маршрут будет выглядеть так:

map.root :controller => 'users', :action => 'show' , :conditions => {:subdomain => /.+/}

Эти широкие, перехватывающие все маршруты должны быть определены последними в маршрутизации route.rb, чтобы они имели самый низкий приоритет, и более конкретные маршруты будут совпадать первыми.

Я также рекомендую использовать проверку в вашей модели User, чтобы исключить возможность выбора пользователем имени пользователя, которое будет конфликтовать с текущими и будущими маршрутами:

class User < ActiveRecord::Base
  validates_exclusion_of :username, :in => %w( messages posts blog forum admin profile )
  …
end
2 голосов
/ 08 декабря 2009

Это не имеет смысла, если у вас нет контроллеров. Что происходит, когда вы хотите назвать контроллер так же, как существующий пользователь? Что если пользователь создает имя пользователя, совпадающее с одним из ваших контроллеров? Это похоже на ужасную идею. Если вы считаете, что / user / слишком длинный, попробуйте создать новый пользовательский маршрут для / u /

Так что ваш собственный маршрут будет ...

map.connect 'u/:id', :controller => 'my/usercontroller', :action => 'someaction'
0 голосов
/ 20 сентября 2015

В Rails 4, чтобы пропустить контроллер из URL, вы должны добавить path: ''.

 resources :users, path: '' do 

 end  
0 голосов
/ 08 декабря 2009

Ну, единственное, что вам нужно, это убедиться, что у вас нет конфликтов имен с вашими пользователями и контроллерами.

Как только вы это сделаете, вы можете добавить маршрут, подобный этому:

map.connect ':username', :controller => 'users', :action => 'show'

Еще одна вещь, которую сделали люди, - это использование поддоменов и переписывание правил на веб-сервере, чтобы вы могли иметь http://joeshmoe.example.com

0 голосов
/ 08 декабря 2009

В route.rb это должно сработать:

map.connect ":login", :controller => 'users', :action => 'show'

Где login - имя переменной, переданной методу show. Обязательно ставьте его после всех других сопоставлений контроллеров.

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