Cloning
March 12, 2024 ยท View on GitHub
Many users find it easier to clone records that have similar content, rather than spending the time manually setting them up. Fae has the ability to allow one-click clones from the index or the edit form, as well as flexibility to whitelist attributes and clone assocations.
Basic
The most basic implementation of this feature clones the record, all it's attributes (except id, created and updated at) and any belongs_to associations via foreign_keys. We also check for any uniqueness validators on your attributes and rename them to "attribute-#", starting at 2, for your convenience.
Add Buttons
You may add the clone button to the index, edit form, or both.
Examples
For Index
Add the following to your thead, usually after 'Delete':
th.-action data-sorter="false" Clone
And to your tbody:
td = fae_clone_button item
For Form
Simply pass cloneable: true into your form_header partial. You may also edit the default text 'Clone', by passing in clone_button_text and your own string.
render 'fae/shared/form_header', cloneable: true, clone_button_text: 'Duplicate Me!'
That's all for basic set-up.
Advanced
If you want complete control over which attributes and associations are cloned, we wouldn't call you a control freak. We've baked in some nice simple methods to make this possible.
Note: Asset cloning is supported.
Whitelisting Attributes
If you want to whitelist attributes to be cloned, you may add the attributes_for_cloning method into your controller's private method. Just pass in an array of symbols and we will take care to only copy those attributes over.
Note: please make sure to include everything that is required, or the record will fail to get created. You've been warned.
Example
def attributes_for_cloning
[:name, :slug, :description, :wine_id]
end
Cloning Associations
Belongs_to associations are automatically copied over, unless you are whitelisting attributes and forget to/ purposely don't add it there. For the rest of the associations you may have (i.e. has_one, has_many, has_and_belongs_to_many, has_many_through), you may use the associations_for_cloning method by passing in array of symbols.
Example
def associations_for_cloning
[:aromas, :events, :bottle_shot_image]
end
Fae Clone Button
You can use fae_clone_button in your list view tables to provide easy access to clone an item. Just pass in the item and the button will clone the object and take you to the newly created object's edit form.
fae_clone_button item