I have a Project model which accepts nested attributes for tasks. And Task has a virtual attribute “name”. So every time I change the name, it gets persisted as encrypted_task_name before update. On the project edit page the form has a input field for task name (and not encrypted_task_name). When I change the name and since name is a virtual attribute, Rails doesn’t detect a change in Task and doesn’t update that task while updating Project.
How do I make sure that task is saved even if its virtual attributes are changed during Project update?
One option that I don’t want to use is :autosave => true on task.rb since I task is rarely updated.
I ran into the same problem. Using
:autosave => truedidn’t even work for me. I managed to solve it by addingattribute_will_change!(:my_virtual_attribute)to the writer for my virtual attribute. So, in your case:This marks the object as unchanged or dirty, and that makes update_attributes save the nested model correctly.
Links:
http://apidock.com/rails/ActiveRecord/Dirty/attribute_will_change%21
http://ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects