需要手动更新friendly_id

时间:2014-01-24 19:13:54

标签: ruby-on-rails ruby-on-rails-3 friendly-id

我在网址上有一张照片:

www.mysite.com/here-is-my-url

我已经为这张照片创建了一个替代品,但我希望旧网址指向新资源。即新资源是www.mysite.com/new-url,但我希望URL为www.mysite.com/here-is-my-url,对于旧资源,我想将其更改为其他内容。< / p>

我知道最好不要手动操作friendly_id slugs,但这是一个紧急的一次性类型的东西,我试图找出最轻松的方式(最好通过控制台)。

有什么想法?我基本上需要通过控制台访问friendly_id_slugs表,但是当我尝试使用FriendlyIdSlug.all时,我得到了一个未初始化的常量错误。

3 个答案:

答案 0 :(得分:2)

def should_generate_new_friendly_id?
  slug.blank? || name_changed?
end

将其添加到您的模型中。 name_change?应为[whatever your column is that decides the slug]_changed?

答案 1 :(得分:0)

通常情况下,没有FriendlyIdSlug模型/表,因此在FriendlyIdSlug.all上获取未初始化的常量错误有点好。

当您向资源添加friendly_id时,它只会添加一个slug字段,只要该字段为空,就会根据指定的字段(在您的情况下为title)重新生成。如果标准段塞生成过程为您提供了在相应表格中不唯一的段塞,friendly_id通过向其添加--nn整数)来改变它,直到它变得唯一。

那就是说,为了解决你的情况,你必须

  1. 更改旧对象的标题,将其slug设置为nil,保存。
  2. 将新对象的slug设置为nil,另存为。
  3. 如果需要,请更改旧对象的标题。
  4. 例如,如果您的模型是Photo,则在您的控制台中会是这样的:

    old = Photo.find('here-is-my-url')
    new = Photo.find('here-is-my-url--2')
    old.title = 'Here is my OLD URL'
    old.slug = nil
    old.save
    new.slug = nil
    new.save
    

答案 2 :(得分:0)

有一种方法可以通过控制台执行此操作。我有一个生产网站,我需要更新一个friendly-id slug,因为我们一直在推广带有印刷传单的URL。古老,是的,我知道。试试这个:

Model.all (find to find the id of the slug you'd like to change)
u = Model.find(id) (integer of the id you'd like to change)
u.slug = nil
u.slug = 'slug-of-your-choice'
u.update_attribute(:slug, 'slug-of-your-choice')

现在,如果你检查Model.all,你会看到你的Model对象带有手动更新的slug。也在现场测试。 更新slug后使用u.save对我不起作用。 此外,此处使用的update_attribute样式是Rails 3,因此对Rails 4使用Rails 4语法。