RoR中的SEO友好URL
假设我有一个相对基本的CRUD应用程序来编辑音乐专辑。 在我拥有的数据库中:
id | album_name | artist | navigation 1 Lets Talk Lagwagon lets-talk
但是,我不希望albums/1
返回我的“ Show
页面,而是希望通过albums/lets-talk
自由albums/lets-talk
路径访问该页面。
所以在我的控制器中我有:
def show @album = Album.find_by_navigation(params[:id]) end
在我的索引视图中,我有:
"albums", :action => "show", :id => album.navigation %>
这成功地执行了它的function,然而,Ruby API说我的link_to方法陈旧且陈旧而没有列出替代方案,所以我怀疑我的方法是错误的。
看看friendly_id gem。 这正是你所需要的。
在模型中定义to_param:
class album def to_param "#{id}-#{album-name.parameterize}" end end
现在你可以使用了
<%= link_to album.album_name, album %>
创建到seo路径的链接
然后在你的控制器中:
Album.find(params[:id])
将调用to_i
– >所以你得到Topic.find(2133)
或其他什么。
这将形成以下forms的url:“/ album / 2-dark-side-of-the-moon”虽然不完全符合要求但具有优势 – 该ID用于查找专辑 – 这是唯一的,当这个名字可能不是。
参数化方法“替换字符串中的特殊字符,以便它可以用作’漂亮’URL的一部分” – http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize
如果你想在浏览器中显示URL作为app/albums/lets-talk
但是POST params作为album_id => 1
,用于购物车添加等。
在您的相册模型中:
# PRODUCT MODEL before_create do self.navigation = album_name.downcase.gsub(" ", "-") end def to_param [id, album_name.parameterize].join("-") end
现在你可以
@album = Album.find_by_navigation(params[:id])
和
album = Album.find(params[:album_id])
您似乎想要覆盖:id参数:name参数。 本文描述了这种情况。
class User < ActiveRecord::Base def to_param # overridden name end end user = User.find_by_name('Phusion') link_to 'Show', user_path(user) # => Show