Как проверить измененное значение в обратном вызове модели before_save? - PullRequest
6 голосов
/ 17 декабря 2011

Как я могу прочитать значение, которое контроллер установил в обратном вызове before_save?

Пример:

У меня есть модель с полем url.Перед сохранением я хочу проверить, был ли изменен URL.Если так, сделайте что-нибудь с новым и старым URL.

Возможно ли это?

Ответы [ 4 ]

20 голосов
/ 17 декабря 2011

Попробуйте что-то вроде этого:

before_save { |m| if m.url_changed? ... }

Также см. Документы по ActiveModel :: Dirty

1 голос
/ 22 июня 2015
  • лучший способ

before :todo, if: :first_name_or_last_name_changed?

  • и ваш todo метод

def first_name_or_last_name_changed?
first_name_changed? || last_name_changed
конец

0 голосов
/ 11 апреля 2014

Я пробовал эту вещь, но это не сработало

#Non-working code
before_save: record_old_value
after_save: record_change

def record_old_value
   @old_value = self.field
end

def record_change
   if @old_value==self.field
      create_record_in_history :old_value => @old_value, :new_value => self.field
   end
end

Причина, по которой это не сработало, была в том, что мы установили self.field = new_value, чтобы в before_save он был недоступен Но у rails есть еще функция Active-record, например field_changed , которую можно напрямую использовать как before_save, так и after_save. Так что я закончил с этим решением

#working code
after_save :run_function
def run_function
   @old_value = field_was
   if @old_value==self.field
      create_record_in_history :old_value => @old_value, :new_value => self.field
   end
end
0 голосов
/ 17 декабря 2011

Если он изменился, он должен быть в хеше params. Если оно не изменилось, его там не должно быть. Следовательно, вы можете поместить эту пользовательскую обработку в контроллер или метод в модели, которая делает это.

Если вы действительно хотите получить к нему доступ в before_save, проверьте документацию по обратным вызовам ActiveRecord, и вы увидите, как получить доступ к значениям до и после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...