浏览 2935 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-10-10
map.connect ':controller/:action/:id' 这为我们生成/contrller_name/action_name/id 这个样式的URLs 而我们可以编写to_params方法来定义一个比较友好的url: def to_params "#{id}-#{title}" end 当to_i被调用后,"123-hello-world"会转换成为123 >> "123-hello-world-1".to_i => 123 但to_params的使用,比较的单一,考虑下面的这种方式: def to_params "#{title}" end 结果是无法运行。 现在,friendly_id插件提供了这样的一个功能,它可以让你构建非常友好的URLs Homepage: http://github.com/norman/friendly_id 建立测试项目: >>rails friendly_id >>cd friendly_id >>rake db:create >>ruby script/generate post title:string content:text >>rake db:migrate 安装: 1. gem install friendly_id 2. script/generate friendly_id 3. rake db:migrate 使用: 1. 在environment.rb的Rails::Initializer.run do |config|中添加: config.gem "friendly_id" 2. 在Model中增加: has_friendly_id :title, :use_slug => true 下面,我们就可以使用http://127.0.0.1:3000/posts/first这样的URL了。 其实现原理,只要看一下生成的表,我想,大家就知道了: ![]() 那如果post的title不唯一呢?怎么办?借XXX书里的说法,自己试一下,就知道啦。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-10-12
最近正想实现这个,非常好!
|
|
返回顶楼 | |
发表时间:2009-10-14
只是有个问题,就是用到friendly_id的数据必须是在安装并且在模型里配置之后才能使用。
如果有之前遗留的数据就不能用。 或许手工的按照他的规则把数据导入slugs应该可以解决这个问题。一会儿试试看。 |
|
返回顶楼 | |
发表时间:2009-10-15
一直以来对多态表的使用抱有疑虑.
比如现有一张articles的表有100w以上的记录,那对应在slugs里也需要有100w条记录,这里还不算上其它sluggable_type的记录.仅在显示一条articles记录时就需要关联这两张比较大的表, 效率上肯定不如单独操作articles表来的快. 关键是为了SEO做这样的牺牲我个人感觉不值, 况且直接写在articles表里单独做一个字段处理也没什么不方便. 是不是还有其他的好处,是我不曾想到? |
|
返回顶楼 | |
发表时间:2009-10-15
slugs是可以不使用的,但这样的话,比如说,title,就必须要唯一了,如果你确定需要处理的friend id字段是唯一的,则直接使用就可以了。
|
|
返回顶楼 | |
发表时间:2009-10-15
还有一个问题,不使用slugs的时候friendly_id不会把例如 secret garden中的空格在URL中改成 - 。
稍稍改了一点插件的代码来替换,不过新问题又出来了,如果原来的title字段中就有-,那再匹配回来的时候-也会被替换掉。 可能是gsub的正则表达式没写好。 |
|
返回顶楼 | |
发表时间:2009-10-16
rainlife 写道 slugs是可以不使用的,但这样的话,比如说,title,就必须要唯一了,如果你确定需要处理的friend id字段是唯一的,则直接使用就可以了。
title唯一不唯一和slugs没什么必要关系吧. ![]() "#{id}-#{title}" 这样的组合一样可以查找到需要的记录. 再者title中会有中文, 如果将其转换成拼音或是其他格式,长度问题也不爽 |
|
返回顶楼 | |
发表时间:2009-10-16
Raecoo 写道
rainlife 写道
slugs是可以不使用的,但这样的话,比如说,title,就必须要唯一了,如果你确定需要处理的friend id字段是唯一的,则直接使用就可以了。
title唯一不唯一和slugs没什么必要关系吧. ![]()
有关系啊,title唯一就不需要使用slugs,也就不会在那个表里添加对应关系的记录了。 |
|
返回顶楼 | |
发表时间:2009-10-16
title不唯一不使用slugs不成吗? id+title 不行?
|
|
返回顶楼 | |
发表时间:2009-10-24
生成一个join的SQL语句
SELECT items.* FROM `items` INNER JOIN `slugs` ON `slugs`.sluggable_id = `items`.id AND `slugs`.sluggable_type = 'Item' WHERE (`slugs`.`sequence` = '1' AND `slugs`.`scope` IS NULL AND `slugs`.`name` = 'test-slug') LIMIT 1 如果记录多了可能会有点麻烦,不过那个cached_slug字段可能会有效,但个觉得slug还是在主表里加个字段比较好,否则单为这个东西做join不划算. |
|
返回顶楼 | |