RoR中的SEO友好URLs

4

假设我有一个比较基础的CRUD应用程序,用于编辑音乐专辑。在数据库中,我有:

id | album_name | artist  |  navigation

1    Lets Talk   Lagwagon    lets-talk

然而,我希望albums/1不再返回我的Show页面,而是通过albums/lets-talk路径访问该页面。

因此,在我的控制器中,我有:

  def show
    @album = Album.find_by_navigation(params[:id])
  end

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

<%= link_to 'Show', :controller => "albums", :action => "show", :id => album.navigation %>

这个方法能够成功地执行其功能,但是 Ruby API 表示我的 link_to 方法已经过时而没有列出替代方法,所以我怀疑我的方法可能不正确。

4个回答

17
在模型中定义您的to_param:
class album
    def to_param
        "#{id}-#{album-name.parameterize}"
     end
end

现在你可以使用。
<%= link_to album.album_name, album %>

将文本翻译为中文:

创建到SEO路径的链接

然后在你的控制器里:

Album.find(params[:id])

“will call to_i -> 这样你就可以得到 Topic.find(2133) 或者其他类似的内容。”
“这将导致形如“/album/2-dark-side-of-the-moon”的 URL,虽然不完全符合要求,但具有优点——使用 id 查找唱片,而 id 是唯一的,而名称可能不是。”
“parameterize 方法‘替换字符串中的特殊字符,以便将其用作“漂亮”的 URL 的一部分’- http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize。”

1
为什么要踩?这是在CodeSchool的Rails最佳实践课程中的做法。在我完成的项目中似乎效果不错。难道我错过了问题的重点吗? - Will
不是我给你点的踩,我只是看了一下。虽然这次我没有使用这个特定的解决方案,但我很感激这些信息。CodeSchool怎么样?值得吗? - Nick Brown
首先,使用"#{id}-#{album-name.parameterize}",你的URL将是/album/2-lets-talk,而不是/album/lets-talk。其次,当你使用parametrize时,对于非拉丁语系的名称,链接中的名称将与对象的名称不同,这种情况不匹配问题。这就是为什么会被downvote的原因。 - antiqe
好的。感谢反馈。我已经更新了我的答案,以说明为什么您可能不想依赖专辑名称来解决这种问题。这是解决此类问题的一种可能方式。但是,仅使用未更改的名称是不可取的。 - Will

6

Sergey,这正是我需要的,谢谢。@TylerDeWitt 感谢您提供的链接,昨晚我在搜索解决方案时不知道为什么错过了它。 - Nick Brown

1
如果您想要在浏览器中将URL显示为app/albums/lets-talk,但是POST参数为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])

0

看起来你想将: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)  # => <a href="/users/Phusion">Show</a>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接