10

地狱狂热者

我想在用户的显示页面中显示用户名而不是 user_id。

例如,

名为 harry 的用户的 usr_id 300 存在于数据库中。那么如何展示

http://localhost:3000/哈利

代替

http://localhost:3000/user/300

在网址中。

这可以在路由文件中完成吗?

谢谢

4

3 回答 3

15

这通常被称为虚 URL,只要稍加注意,您就可以很容易地处理它。第一的...

  1. 确保这是您路线中的最后一件事。您不希望您的用户名覆盖另一个控制器的命名空间。
  2. 使用合理的排除列表来防止用户使用 admin、support、official、secure 等用户名。

在您的路线中:

# 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 当前识别的路线。清理你不需要的也是一件好事。;)

于 2011-02-27T02:03:36.703 回答
4

如果你想拥有 /:username,然后在你的 routes.rb 文件上试试这个(这应该是最后一行!- 创建最后一条路线!)

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

然后,为了让它不那么可怕,您可以使用make_permalink gem轻松创建友好的 url 名称并覆盖模型中的 to_param 方法

# models/user.rb
make_permalink :username    

def to_param
  permalink
end

为了使它更好,覆盖 User.find 方法以通过永久链接或 id 工作

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

这适用于 User.find(1) 或 User.find(my_username)。

希望有帮助,

尼古拉斯·霍克·伊萨萨

于 2011-02-27T01:53:59.480 回答
0

在 routes.rb 中尝试这样的事情

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

稍后在视图中像这样使用它:

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

我不确定代码是否只需粘贴就可以工作,但你明白了:)

于 2011-02-27T01:43:14.070 回答