RoR中的SEO友好URL

Nic*_*own 4 ruby seo routing ruby-on-rails

假设我有一个相对基本的CRUD应用程序来编辑音乐专辑.在数据库中我有:

id | album_name | artist  |  navigation

1    Lets Talk   Lagwagon    lets-talk
Run Code Online (Sandbox Code Playgroud)

但是,我希望路由无法访问页面,而不是albums/1返回Show页面albums/lets-talk.

所以在我的控制器中我有:

  def show
    @album = Album.find_by_navigation(params[:id])
  end
Run Code Online (Sandbox Code Playgroud)

在我的索引视图中,我有:

<%= link_to 'Show', :controller => "albums", :action => "show", :id => album.navigation %>
Run Code Online (Sandbox Code Playgroud)

这成功地执行了它的功能,但是,Ruby API说我的link_to方法陈旧且陈旧而没有列出替代方案,所以我怀疑我的方法是错误的.

Wil*_*ill 17

在模型中定义to_param:

class album
    def to_param
        "#{id}-#{album-name.parameterize}"
     end
end
Run Code Online (Sandbox Code Playgroud)

现在你可以使用了

<%= link_to album.album_name, album %>
Run Code Online (Sandbox Code Playgroud)

创建指向seo路径的链接

然后在你的控制器中:

Album.find(params[:id])
Run Code Online (Sandbox Code Playgroud)

会打电话to_i- >所以你得到了Topic.find(2133)或者其他什么.

这将形成以下形式的网址:"/ album/2-dark-side-of-the-moon"虽然不完全符合要求但具有优势 - 该id用于查找专辑 - 这是唯一的,当这个名字可能不是.

参数化方法"替换字符串中的特殊字符,以便它可以用作'漂亮'URL的一部分" - http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize


Ser*_*nin 5

看看friendly_id gem.这正是你所需要的.

  • [Railscast](http://railscasts.com/episodes/314-pretty-urls-with-friendlyid) (2认同)