2010-01-26 60 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> 

我認爲這是一個很好的選擇,如果你不想使用寶石。

相關問題