замените user_id на имя пользователя на странице показа в рельсах - PullRequest
10 голосов
/ 27 февраля 2011

адских друзей

Я хочу показать имя пользователя вместо user_id на странице показа пользователя.

Например,

usr_id 300 для пользователя с именем harry существует в базе данных. Так как показать

http://localhost:3000/harry

вместо

http://localhost:3000/user/300

в URL.

Можно ли это сделать из файла маршрутов?

Спасибо

Ответы [ 3 ]

15 голосов
/ 27 февраля 2011

Это обычно называют тщеславным URL, и с небольшой осторожностью вы можете справиться с этим довольно легко.Первый ...

  1. Убедитесь, что это последнее, что есть на ваших маршрутах.Вы не хотите, чтобы ваши имена пользователей перекрывали пространство имен другого контроллера.
  2. Используйте разумный список исключений, чтобы запретить пользователям иметь такие имена пользователей, как admin, support, official, secure и т. Д.

Inваши маршруты:

# the simple case
get '/:username' => 'users#show', :constrain => { :username => /[a-zA-Z-]+/ }

# ...with vanity_url_path(@user) helpers
get '/:username' => 'users#show', :as => 'vanity_url'

# or routing something more complicated with all the default resourceful routes
resources :users, :path => '/:username'

# or even just defining a bunch of routes for users with this format
controller :users, :path => '/:username' do
  get '/profile', :action => :profile    #=> /johnsmith/profile => UsersController#profile
end

В приведенном выше коде я избежал дублирования параметра :constrain для каждого маршрута для ясности.Вы захотите настроить регулярное выражение так, чтобы оно совпадало с вашими именами пользователей, а затем убедитесь, что оно есть у вас на любом маршруте.

Если это будет стандартный способ доступа к пользователям из вашего приложения (т. Е. Не просто удобный способ доступа к профилю пользователя), вы можете переопределить метод to_param длямодель ваших пользователей.Это позволяет использовать помощники url_for, например form_for @user, без указания дополнительных аргументов.

class User
  def to_param
    username
  end
end

Еще один быстрый совет: если вы играете со своими маршрутами и пытаетесь сделать что-то большее, чем просто основы, не забывайте часто вызывать $ rake routes из командной строки, чтобы увидеть, какие маршруты в настоящее время распознает Rails.,Очистить те, которые вам не нужны, тоже хорошо.;)

4 голосов
/ 27 февраля 2011

Если вы хотите иметь /: имя пользователя, попробуйте это в своем файле rout.rb (ЭТО ДОЛЖНО БЫТЬ ПОСЛЕДНЕЙ ЛИНИей БЛОКА! - Последний маршрут создан!)

match "/:id", :to => "users#show", :as => :friendly_user

Тогда просточтобы сделать его менее ужасным, вы можете использовать гем make_permalink , чтобы легко создавать дружественные URL-имена и переопределять метод to_param в вашей модели

# models/user.rb
make_permalink :username    

def to_param
  permalink
end

И, чтобы сделать его еще лучше, переопределитьметод User.find для работы с постоянной ссылкой или идентификатором

def self.find(query)
  self.find_by_username(query) || super(query)
end

, который будет работать для User.find (1) или User.find (my_username).

Надеюсь, что поможет,

Николас Хок Исаза

0 голосов
/ 27 февраля 2011

попробуйте что-то подобное в маршрутах.rb

map.user_permalink 'users/:user_name', :controller => 'users', :action => 'show'

позже в представлениях используйте это так:

<%= link_to user.name, user_permalink_path(user.user_name.parameterize) %>

Я не уверен, будет ли работать код, просто вставив его, но вы поняли:)

...