2015-01-13 6 views
0

Предположим, у нас есть 2 сообщения с такими же названиями: «superheros». Первая почта должна иметь urhe superheros-alternative-1, а вторая должна иметь superheros-alternative-2. Проблема в том, что когда я обновляю заголовок одного из этих сообщений, URL-адрес должен измениться для обоих из них. Я имею в виду, если я изменю название на «чудо», тогда URL-адреса должны стать следующими: marvel-alternative-1 и marvel-alternative-2. Теперь у меня есть следующий кодДружественный идентификатор для дубликатов

class Post < ActiveRecord::Base 

    before_update :update_slug 

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

    def update_slug 
    title = Post.find(self.id).title 
    Post.where(title:title).each do |post| 
     post.update_column(:title,self.title) 
    end 
    end 
end 
+0

Итак, что ваш __question__ в точку? У вас его нет. –

+0

О, извините, вопрос был: «Как обновить URL главной страницы и ее копии, когда мы обновляем их название?» –

ответ

1

Вы не должны использовать update_column для этого because it will not trigger the callbacks, validations and such, поэтому, friendly_id не будет обновлять свой слизняка. Обновите атрибут объекта модели и вместо этого вызовите .save.

Кроме того, вы можете обновить другие записи после того, как вы обновили свой регулярный один (в after_save обратный вызов) - там вы будете иметь доступ к первоначальному названию и новый, без необходимости делать дополнительные Post.find(self.id)

+0

Да, вы правы, что 'update_column' не вызывает обратные вызовы. Вероятно, вы правы, что лучшим решением было бы сделать эту операцию в контроллере, а не в модели. Большое спасибо! –

+0

@ArtemGalas Я имел в виду ['after_save' обратный вызов ActiveRecord в модели] (http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html), а не в контроллере. ;) –

 Смежные вопросы

  • Нет связанных вопросов^_^