我正在構建一個Rails應用程序,我想堅持所有那些奇特的東西,如REST和資源,但我想自定義我的路線。我希望我的GET路線更加冗長 - 我創建的應用程序是一個簡單的博客,所以我不喜歡GET /posts/1
,我喜歡GET /posts/1-my-first-post
之類的東西。Rails路由 - 資源的自定義路由
任何想法如何做到這一點?沒有在網上找到任何東西。
我正在構建一個Rails應用程序,我想堅持所有那些奇特的東西,如REST和資源,但我想自定義我的路線。我希望我的GET路線更加冗長 - 我創建的應用程序是一個簡單的博客,所以我不喜歡GET /posts/1
,我喜歡GET /posts/1-my-first-post
之類的東西。Rails路由 - 資源的自定義路由
任何想法如何做到這一點?沒有在網上找到任何東西。
路線:
map.resources :posts
型號:
class Post < ActiveRecord::Base
def to_param
"#{id.to_s}-#{slug}"
end
end
應該做的伎倆。
在模型中定義to_param
方法,所有的網址助手將憂色你與該方法返回的內容,如:
class Post < ActiveRecord::Base
der to_param
slug
end
end
你也需要去適應你的控制器,用於那。替換:
Post.find(params[:id])
有:
Post.find_by_slug(params[:id])
還要注意的是找到方法引發的ActiveRecord :: RecordNotFound異常,當同時使用find_by_ *方法不存在例外情況,從而提高了記錄無法找到你需要手動檢查。
或者......
添加這樣的方法來application_helper.rb
def permalink(post)
"#{post_path(post)}-#{post.slug}"
end
然後使用你的意見以下(使用permalink(@post)
代替post_path
)
<%= link_to @post.title, permalink(@post) %>
或者.. 。
添加這樣的方法來post.rb
def path
"/posts/#{id}-#{slug}"
end
然後使用按照您的看法:
你可以找到friendly_id插件有用,因爲它也將處理重定向,如果您重新命名蛞蝓(因此搜索引擎友好),處理名稱衝突並無縫集成find方法,因此您不需要觸摸控制器方法(除重定向之外)。