2010-01-26 57 views
9

我希望用户能够在site.com/myNameHere上拥有一个配置文件页面。 Rails寻找名为“myNameHere”的控制器。是否可以设置routes.rb,以便如果找不到控制器,“myNameHere”会作为参数发送给另一个控制器?如何在Rails应用程序中实现虚空URL?

+0

只要确保如果您选择使用虚荣宝石,就可以知道在redirect_to中的vanities_controller.rb中存在vulrenability,只需添加:only_path => true,您应该是好的 – dennis 2012-08-01 14:53:54

回答

9

您可以添加一个路线是这样的:

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

一定要添加它足够低,在该文件中,下方的资源,它不与其它路线干扰。它应该是最低优先级。接下来,您需要更改您的show动作以使用用户名代替id:

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

这就是它的全部。快乐的编码!

UPDATE:

我已经扩大了这个答案成为一个完整的博客文章,Vanity URLs in Ruby on Rails Routes。我有其他代码示例和更详尽的解释。

+0

谢谢,工作起来就像一个魅力。 – user258980 2010-01-26 17:56:10

+2

您需要记住,根级别的通配符路由会捕获应该是顶级404错误的内容。即http://domain.com/askdjasd。所以你可能想在你的show动作中添加一些异常处理(找不到),并渲染你的404而不是500的错误。 – 2010-12-20 16:13:49

+5

根据Dave Rapin的说法,您可以在控制器中使用'rescue_from ActiveRecord :: RecordNotFound :: with:>:your_404_method'来在未找到用户时自动显示404错误。如果你使用'find_by_attribute'方法,你将不得不手动提出这个错误,因为它们不会自动引发它们。因此,使用'raise ActiveRecord :: RecordNotFound除非@user = User.find_by_username(params [:username])'和相关的救援,你是金。 – coreyward 2011-01-05 01:55:32

0

只是想我会更新这个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 
<h1><%= @user.website %> events</h1> 

<table> 
    <tr> 
    <th>Title</th> 
    <th>Starts at</th> 
    <th>Description</th> 
    <th></th> 
    <th></th> 
    <th></th> 
    </tr> 

<% @events.each do |event| %> 
    <tr> 
    <td><%= event.title %></td> 
    <td><%= event.starts_at %></td> 
    <td><%= event.description %></td> 
    </tr> 
<% end %> 
</table> 

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

相关问题