Rails +使用友好ID生成段塞并在从DB访问时产生问题

时间:2014-11-19 10:49:00

标签: ruby-on-rails routing ruby-on-rails-3.2 routes slug

面对Rails中Slug的一些奇怪问题

Loading development environment (Rails 3.2.13)
2.1.2 :001 > Tutorial.last
  Tutorial Load (0.7ms)  SELECT "tutorials".* FROM "tutorials" 
  ORDER BY "tutorials"."id" DESC LIMIT 1

 => #<Tutorial id: 3, title: "Populating the Database’s with seeds.rb",
    state: "Publish", content_introduction: "<p>Demo Data</p>\r\n", 
    slug: "populating-the-database-s-with-seeds-rb"> 

2.1.2 :002 > Tutorial.last.slug
  Tutorial Load (0.6ms)  SELECT "tutorials".* FROM "tutorials" 
    ORDER BY "tutorials"."id" DESC LIMIT 1
 => "populating-the-database’s-with-seeds.rb" 

在数据库中,它通过替换特殊字符显示“ - ”,但在访问时会显示它。

模型

def slug
  title.strip.downcase.gsub(/[:,'"%^&*+=<>.`~]/,"").gsub("’","").gsub("  ", " ").gsub(" ", "-")
end

def to_param
  "#{slug}".parameterize
end

extend FriendlyId
friendly_id :title, use: [ :slugged, :history ]   

因此,使用slug访问页面时会出错。请看一下并提出一些建议。

1 个答案:

答案 0 :(得分:0)

您在Tutorial.last中看到slug的值与Tutorial.last.slug中的slug值之间存在差异

Tutorial.last从表中获取最后一条记录,该记录为您提供了保存在数据库中的slug,但Tutorial.last.slug正在调用模型中定义的slug方法, Tutorial.last是一个对象,使用该对象调用slug方法

def slug
  title.strip.downcase.gsub(/[:,'"%^&*+=<>.`~]/,"").gsub("’","").gsub("  ", " ").gsub(" ", "-")
end

所以注释掉上面的方法,你会在两种情况下得到相同的结果!

看起来您在模型中定义的slug方法正在操纵title字段以获取slug值,但据我所知{gem}本身friendly_id处理它,所以只要注意slug方法。它会解决你的问题。希望这有帮助!