如何在Rails应用程序中实现虚荣URL?

我希望用户能够在site.com/myNameHere上找到个人资料页面。 Rails查找名为“myNameHere”的控制器。 是否可以设置routes.rb,以便在找不到控制器时,“myNameHere”作为参数发送到另一个控制器?

你可以添加这样的路线:

map.profile_link '/:username', :controller => 'profiles', :action => 'show' 

请确保在文件中,在资源下方添加足够低的值,使其不会干扰其他路径。 它应该是最低优先级。 接下来,您需要更改show动作以使用用户名而不是id:

 def show @user = User.find_by_username(params[:username]) end 

这里的所有都是它的。 快乐的编码!

更新:

我已经将这个答案扩展到一篇完整的博客文章, Ruby on Rails Routes中的虚荣URL 。 我有其他代码示例和更全面的解释。

我只想到我会为Rails 3更新这个。我的用户模型中有一个字段“网站”,它将充当虚荣路径,我将路由到每个虚荣路径的静态页面。 如果调用虚荣路径,我想显示所有用户的事件。

 #config/routes.rb get '/:website', :controller => 'static_pages', :action => 'vanity' #app/controllers/static_pages_controller.rb def vanity @user = User.find_by_website(params[:website]) if @user != nil #in case someone puts in a bogus url I redirect to root @events = @user.events else redirect_to :root end end #app/views/static_pages/vanity.html.erb 

<%= @user.website %> events

<% @events.each do |event| %> <% end %>
Title Starts at Description
<%= event.title %> <%= event.starts_at %> <%= event.description %>

我认为如果你不想使用gem,这是一个很好的选择。