@@ -4,11 +4,11 @@ module Persistence
44 extend ActiveSupport ::Concern
55
66 class_methods do
7- def before_attributes ( method = nil , only : [ :create , :update ] , &blk )
7+ def before_attributes ( method = nil , only : [ :create , :update , :assign ] , &blk )
88 add_callback ( :attributes , :before , method , only , &blk )
99 end
1010
11- def after_attributes ( method = nil , only : [ :create , :update ] , &blk )
11+ def after_attributes ( method = nil , only : [ :create , :update , :assign ] , &blk )
1212 add_callback ( :attributes , :after , method , only , &blk )
1313 end
1414
@@ -69,15 +69,29 @@ def add_callback(kind, lifecycle, method, only, &blk)
6969 end
7070 end
7171
72+ def assign ( assign_params , meta = nil , action_name = nil )
73+ id = assign_params [ :id ]
74+ assign_params = assign_params . except ( :id )
75+ model_instance = nil
76+
77+ run_callbacks :attributes , action_name , assign_params , meta do |params |
78+ model_instance = if action_name != :create && id
79+ self . class . _find ( id : id ) . data
80+ else
81+ call_with_meta ( :build , model , meta )
82+ end
83+ call_with_meta ( :assign_attributes , model_instance , params , meta )
84+ model_instance
85+ end
86+
87+ model_instance
88+ end
89+
7290 def create ( create_params , meta = nil )
7391 model_instance = nil
7492
7593 run_callbacks :persistence , :create , create_params , meta do
76- run_callbacks :attributes , :create , create_params , meta do |params |
77- model_instance = call_with_meta ( :build , model , meta )
78- call_with_meta ( :assign_attributes , model_instance , params , meta )
79- model_instance
80- end
94+ model_instance = assign ( create_params , meta , :create )
8195
8296 run_callbacks :save , :create , model_instance , meta do
8397 model_instance = call_with_meta ( :save , model_instance , meta )
@@ -89,15 +103,9 @@ def create(create_params, meta = nil)
89103
90104 def update ( update_params , meta = nil )
91105 model_instance = nil
92- id = update_params [ :id ]
93- update_params = update_params . except ( :id )
94106
95107 run_callbacks :persistence , :update , update_params , meta do
96- run_callbacks :attributes , :update , update_params , meta do |params |
97- model_instance = self . class . _find ( id : id ) . data
98- call_with_meta ( :assign_attributes , model_instance , params , meta )
99- model_instance
100- end
108+ model_instance = assign ( update_params , meta , :update )
101109
102110 run_callbacks :save , :update , model_instance , meta do
103111 model_instance = call_with_meta ( :save , model_instance , meta )
0 commit comments