`
rainlife
  • 浏览: 229990 次
  • 性别: Icon_minigender_1
  • 来自: 我也来自火星?
社区版块
存档分类
最新评论

Better looking URLs with friendly_id

阅读更多
在rails中,我们默认的URLs在routes.rb中的定义是这样的

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书里的说法,自己试一下,就知道啦。

  • 大小: 31.1 KB
分享到:
评论
9 楼 活靶子 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不划算.
8 楼 Raecoo 2009-10-16  
title不唯一不使用slugs不成吗? id+title 不行?
7 楼 ywencn 2009-10-16  
<div class="quote_title">Raecoo 写道</div>
<div class="quote_div">
<div class="quote_title">rainlife 写道</div>
<div class="quote_div">slugs是可以不使用的,但这样的话,比如说,title,就必须要唯一了,如果你确定需要处理的friend id字段是唯一的,则直接使用就可以了。</div>
<br>title唯一不唯一和slugs没什么必要关系吧.<img src="/images/smiles/icon_smile.gif" alt=""><br><br>
</div>
<p> </p>
<p>有关系啊,title唯一就不需要使用slugs,也就不会在那个表里添加对应关系的记录了。</p>
6 楼 Raecoo 2009-10-16  
rainlife 写道
slugs是可以不使用的,但这样的话,比如说,title,就必须要唯一了,如果你确定需要处理的friend id字段是唯一的,则直接使用就可以了。

title唯一不唯一和slugs没什么必要关系吧.

"#{id}-#{title}"  这样的组合一样可以查找到需要的记录.

再者title中会有中文, 如果将其转换成拼音或是其他格式,长度问题也不爽
5 楼 ywencn 2009-10-15  
还有一个问题,不使用slugs的时候friendly_id不会把例如 secret garden中的空格在URL中改成 - 。
稍稍改了一点插件的代码来替换,不过新问题又出来了,如果原来的title字段中就有-,那再匹配回来的时候-也会被替换掉。
可能是gsub的正则表达式没写好。
4 楼 rainlife 2009-10-15  
slugs是可以不使用的,但这样的话,比如说,title,就必须要唯一了,如果你确定需要处理的friend id字段是唯一的,则直接使用就可以了。
3 楼 Raecoo 2009-10-15  
一直以来对多态表的使用抱有疑虑.

比如现有一张articles的表有100w以上的记录,那对应在slugs里也需要有100w条记录,这里还不算上其它sluggable_type的记录.仅在显示一条articles记录时就需要关联这两张比较大的表, 效率上肯定不如单独操作articles表来的快.

关键是为了SEO做这样的牺牲我个人感觉不值, 况且直接写在articles表里单独做一个字段处理也没什么不方便.

是不是还有其他的好处,是我不曾想到?
2 楼 ywencn 2009-10-14  
只是有个问题,就是用到friendly_id的数据必须是在安装并且在模型里配置之后才能使用。
如果有之前遗留的数据就不能用。

或许手工的按照他的规则把数据导入slugs应该可以解决这个问题。一会儿试试看。
1 楼 ywencn 2009-10-12  
最近正想实现这个,非常好!

相关推荐

Global site tag (gtag.js) - Google Analytics