Skip to content

Instantly share code, notes, and snippets.

@xarimanx
Last active August 29, 2015 14:19
Show Gist options
  • Save xarimanx/dea2f5e8478b543aa336 to your computer and use it in GitHub Desktop.
Save xarimanx/dea2f5e8478b543aa336 to your computer and use it in GitHub Desktop.
virtual attributes in nested attributes
Accepts Nested Attribute with a virtual attribute
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 => true didn't even work for me. I managed to solve it by adding attribute_will_change!(:my_virtual_attribute) to the writer for my virtual attribute. So, in your case:
class Task < ActiveRecord::Base
..
def name=(the_name)
attribute_will_change!(:name)
..
end
..
end
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment