我正在构建一个Rails应用程序,我想坚持所有那些花哨的东西,如REST和资源,但我想稍微自定义我的路线。我希望我的GET路线更加冗长 - 我正在创建的应用程序是一个简单的博客,因此我更喜欢GET /posts/1
而不是GET /posts/1-my-first-post
。
任何想法如何做到这一点?没有在网上找到任何东西。
答案 0 :(得分:16)
路线:
map.resources :posts
型号:
class Post < ActiveRecord::Base
def to_param
"#{id.to_s}-#{slug}"
end
end
应该做的伎俩。
答案 1 :(得分:4)
在模型中定义一个to_param
方法,所有网址助手都会使用该方法返回的内容,例如:
class Post < ActiveRecord::Base
der to_param
slug
end
end
您还需要调整控制器。替换:
Post.find(params[:id])
使用:
Post.find_by_slug(params[:id])
另请注意,当使用find_by_ *方法找不到记录时,find方法会引发ActiveRecord :: RecordNotFound异常,不会引发异常,因此您需要手动检查。
答案 2 :(得分:2)
你可以找到有用的friendly_id插件,因为如果你重命名你的slug(因此seo友好)它也会处理重定向,处理名称冲突并与find方法无缝集成,所以你不需要触摸你的控制器方法(重定向东西除外)。
答案 3 :(得分:0)
...替代地
将此类方法添加到application_helper.rb
def permalink(post)
"#{post_path(post)}-#{post.slug}"
end
然后在您的观看中使用以下内容(使用permalink(@post)
代替post_path
)
<%= link_to @post.title, permalink(@post) %>
答案 4 :(得分:0)
...替代地
将此类方法添加到post.rb
def path
"/posts/#{id}-#{slug}"
end
然后在您的观看中使用以下内容: