2011-01-26 2 views
2

Это очень простой, но не работает. Я хочу добавить обратный вызов (after_save) для ввода ввода поля.upcase in rails

В моей модели у меня есть:

after_save :upcase_tax_label 

def upcase_tax_label 
    self.tax1_label.upcase! 
    self.tax2_label.upcase! 
end 

Так что, когда я редактирую он должен UPCASE значения и оказывает в CAPS. но нет. Что не так? Спасибо за вашу помощь

+1

Согласовано. Оливье, вы, скорее всего, заставите людей продолжать отвечать на ваши вопросы, когда вы принимаете их ответы. :) – Shaun

+0

не знал, что должен был принять ответы. Сделаю теперь. Благодарю. Но любая идея решить мою проблему? – Olivier

ответ

3

after_save собирается запустить методы upcase после того, как модель уже сохранена в базе данных. Другими словами, это просто увеличение атрибутов объекта в памяти после того, как сохранение уже завершено. Это не то, что вы хотите.

Вы хотите использовать вместо before_save так, что атрибуты upcased до того, как объект записывается в базу данных:

before_save :upcase_tax_label 

private 
def upcase_tax_label 
    tax1_label.upcase! 
    tax2_label.upcase! 
end 

Суть заключается в том, что вы должны явно сохранить модель изменения, которые будут сделаны в базы данных. До тех пор вы просто играете с объектом в памяти.

1
before_save 

будет работать. однако в этой ситуации обычно считается лучшим стилем для написания пользовательского сеттера. это выглядело бы примерно так:

def tax1_label=(val) 
    write_attribute(:tax1_label, val.upcase) 
end 

def tax2_label=(val) 
    write_attribute(:tax2_label, val.upcase) 
end