2014-11-19 1 views
1

Облицовочные какие-то странные проблемы относительно Slug в RailsRails + Использование дружественных ID для генерации пробкового и создавая проблемы при доступе из БД

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 ] 

Таким образом, хотя доступ к странице с помощью слизняка это дает ошибку. Пожалуйста, взгляните и предложите что-нибудь.

+0

Вставьте код ссылки, где вы столкнулись с проблемой – RSB

ответ

0

Существует разница между тем, что вы видите значение слизня в Tutorial.last и что вы получаете в Tutorial.last.slug

Tutorial.last извлекает последнюю запись из таблицы, которая дает вам slug сохраненные в базе данных, но Tutorial.last.slug является вызывая метод slug, определенный в модели, Tutorial.last является объектом и с помощью этого объекта вы вызываете метод slug

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

Так закомментируйте выше метамфетамин и вы получите одинаковые результаты в обоих случаях!

кажется slug метод, который вы определили в модели манипулирует title поле, чтобы получить значение слизняка, но, насколько я знаю friendly_id камень сам обрабатывает его, так что просто закомментировать метод слизняка. Это решит вашу проблему. Надеюсь это поможет!

+1

Согласен. Tutorial.last.slug вызывает метод slug, присутствующий в модели. Хороший Catch .. Спасибо – Rubyist