我已正确设置friendly_id
并且一切正常,使用slu ..
我遇到的问题是我的Tag
模型上的某些名称(这是FriendlyId附加到的模型)需要进行HTML转义。
c++
或.net
等名称。
当我运行Tag.find_each(:&save)
时,它为我生成了所有的slu .... ....但是在那些带有这些名称的标签上,这就是发生的事情:
> c = Tag.where(:name => "c++")
Tag Load (0.9ms) SELECT "tags".* FROM "tags" WHERE "tags"."name" = 'c++'
=> [#<Tag id: 2, name: "c++", num_questions: 187598, created_at: "2013-03-23 07:02:09", updated_at: "2013-03-29 15:34:09", questions_count: 87, slug: "c">]
> Tag.where(:name => ".net")
Tag Load (0.9ms) SELECT "tags".* FROM "tags" WHERE "tags"."name" = '.net'
=> [#<Tag id: 142, name: ".net", num_questions: 149074, created_at: "2013-03-23 07:09:47", updated_at: "2013-03-29 15:34:10", questions_count: 85, slug: "net">]
1.9.3p392 :012 > Tag.where(:name => "c#")
Tag Load (1.0ms) SELECT "tags".* FROM "tags" WHERE "tags"."name" = 'c#'
=> [#<Tag id: 38, name: "c#", num_questions: 435620, created_at: "2013-03-23 07:03:27", updated_at: "2013-03-29 15:34:10", questions_count: 130, slug: "c--3">]
请注意每一条上的slu - 以及它们与每条记录的name
的对应方式。
我该如何解决这个问题?
答案 0 :(得分:1)
friendly_id(至少当您使用:use => :slugged
调用它时)尝试“清理”字段值,以使其在URL中看起来不错。如果要更改该行为,可以覆盖normalize_friendly_id。如果你这样做,你需要确保对你的slug进行URL编码,因为像#
这样的东西在URL中已经有了特殊含义。
对于后来遇到此问题的人来说,工作解决方案是避免使用friendly_id的:use_slugged
,而只是使用标签的原始名称并让它们自动通过Rails的链接帮助程序进行转义。对于“.net”标记,它还要求将路由更改为resources :tags, :constraints => { :id => /.*/ }
,以防止Rails将点解释为路径分隔符。