我有一个带有“公司”模型的基本CRUD。为了显示公司名称,我做了
def to_param
name.parameterize
end
然后我访问了公司控制器中运行http://localhost:3000/companies/american-express
操作的show
。
显然这不起作用,因为show
方法如下:
def show
@company = Company.find_by_id(params[:id])
end
params[:id]
是american-express
。该字符串不存储在任何地方。
保存记录时,是否需要在数据库中存储短字符串(即“American-express”)?或者有没有办法检索公司数据而不保存数据库中的字符串?
答案 0 :(得分:3)
使用参数化值发送ID;
def to_param
new_record? ? super : "#{id}-#{name}"
end
当您在show方法中收集数据时,您可以使用整个参数;
def show
@company = Company.find("12-american-express"); // equals to find(12)
end
还有一个名为permalink_fu的插件,您可以阅读更多关于here的内容。
答案 1 :(得分:2)
我认为friendly_id更有用。
答案 2 :(得分:0)
我在博客软件中使用Category
模型执行类似操作。如果您可以保证parameterize
方法对您的公司名称进行的唯一转换是用破折号替换空格字符,那么您可以简单地执行相反的操作:
def show
@company = Company.find_by_name(params[:id].gsub(/-/, ' '))
end
答案 3 :(得分:0)
答案 4 :(得分:0)
我也会建议friendly_id宝石。 它使您可以灵活地使用持久的永久链接段,也可以剥离变音符号,转换为完整的ASCII等。 基本上它会让你的生活变得更轻松,你可以毫不费力地获得“真正的”永久链接(没有to_param和所需的id解决方法)。
哦,我是否提到永久链接也是版本化的,所以你可以将旧的过时固定链接重定向到当前版本? :)