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