比方说,我有编辑的音乐专辑相对基本的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方法是不上市的替代旧的陈旧,所以我怀疑我会对此错误的方式。
退房friendly_id宝石。 这正是你所需要的。
在模型中定义的to_param:
class album
def to_param
"#{id}-#{album-name.parameterize}"
end
end
现在你可以使用
<%= link_to album.album_name, album %>
创建链接到搜索引擎优化的路径
然后在你的控制器:
Album.find(params[:id])
将调用to_i
- >让您得到Topic.find(2133)
或什么的。
这将导致形式的URL:“/专辑/ 2暗侧的最-月亮”,这虽然不是什么被要求具有的优势 - 该ID用于查找专辑 - 这是唯一的,当名称可能不是。
该参数化方法“替换特殊字符的字符串,以便它可以作为一个‘漂亮’的网址的一部分” - http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-parameterize
如果你想在浏览器中显示的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])
好像你whant覆盖:ID参数:名称参数。 这种情况在描述这篇文章 。
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>