2010-01-15 123 views
0

假設我有一個帶有Post模型的Ruby on Rails博客應用程序。默認情況下,您可以通過http //.../ post/id閱讀帖子。我添加了一個路線鏈接中的漂亮URL在鏈接

map.connect ':title', :controller => 'posts', :action => 'show' 

將接受HTTP標題//.../(標題是唯一的),控制器將做標題查詢並顯示該網頁。但是,當我現在調用<%= link_to h(post.title)時,在視圖中發佈%>,Rails仍然給我鏈接post/id類型。

是否有可能讓Rails在這種情況下爲我自動創建漂亮的鏈接?

回答

1

如果你願意接受:HTTP:/.../ 1234標題文本,你可以這樣做:

def to_param 
    [id, title.parameterize].join("-") 
end 

AR::Base.find忽略位ID之後,所以它「只是工程」。

要使/標題走開,嘗試命名路線:

map.post ':id', :controller => 'posts', :action => 'show', :conditions => {:id => /[0-9]+-.*/ } 

確保任何map.resources :posts電話後這條線路會出現。

+0

但是,這仍然創建http:/.../ post/1234標題文本,即控制器名稱仍然在那裏:-( – Alex 2010-01-15 20:23:46

+0

糟糕,錯過了,答案更新。 – cwninja 2010-01-19 17:20:26

0

您可以覆蓋ActiveRecord's to_param method並使其返回標題。通過這樣做,你不需要爲自己制定路線。只要記住URL編碼它。

什麼可能是一個更好的解決方案是看看The Ruby Toolbox什麼permalinks必須提供。我認爲使用其中之一會比通過to_param自己修復它更好。

+0

的to_param完全不是那麼回事,因爲它仍然會把控制器名稱進入畫面。然而,我會看看永久鏈接插件。 – Alex 2010-01-15 20:25:00

0

我會使用永久鏈接數據庫列,路線,我通常會跳過使用link_to,以支持更快的html定位標記。

設置你的路線,如:

map.connect '/post/:permalink', :controller => 'post', :action => 'show' 

然後在posts_controller的顯示:

link = params[:permalink] 
@post = Post.find_by_permalink(link) 

您的鏈接將被

<a href="/post/<%= post.permalink %>">Link</a> 

然後在您的創建方法,保存之前,對生成永久鏈接

@post = Post.new(params[:post]) 
@post.permalink = @post.subject.parameterize 
if @post.save 
    #ect 
+0

是的,這就是我已經在做的。我希望Rails能夠擁有像這樣的內置功能,其中一個需要注意的是硬編碼的根URL,它會在子目錄下運行時破壞這個應用程序。ActionController :: Base.relative_url_root應該被添加到URL的前面這裏安全的一面。 – Alex 2010-01-15 21:38:09