4

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

id | album_name | artist  |  navigation

1    Lets Talk   Lagwagon    lets-talk

但是,我希望该页面可以通过路由访问,而不是albums/1返回我的页面。Showalbums/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

4 回答 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])

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

这将产生以下形式的 url:“/album/2-dark-side-of-the-moon”,尽管不完全是所要求的,但它具有优势 - id 用于查找专辑 - 这是唯一的,当这个名字可能不是。

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

于 2013-02-26T06:01:42.573 回答
5

查看friendly_id gem。这正是您所需要的。

于 2013-02-26T07:16:27.990 回答
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])
于 2015-07-23T10:45:29.570 回答
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>
于 2013-02-26T06:02:30.230 回答