Skip to content

Commit 7295f97

Browse files
committed
Add active model callbacks around assign_form_attributes and submit
1 parent 8953740 commit 7295f97

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

lib/hyper_active_form/base.rb

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ class Base
88
include ActiveModel::Model
99
include ActiveModel::Attributes
1010
include ActiveModel::Validations
11+
extend ActiveModel::Callbacks
12+
13+
define_model_callbacks :assign_form_attributes, :submit
1114

1215
def self.proxy_for(klass, object)
1316
delegate :new_record?, :persisted?, :id, to: object
@@ -26,16 +29,20 @@ def perform
2629
end
2730

2831
def assign_form_attributes(params)
29-
params = ActionController::Parameters.new(params) unless params.is_a?(ActionController::Parameters)
30-
attribute_names.each do |attribute|
31-
default_value = self.class._default_attributes[attribute]&.value_before_type_cast
32-
public_send(:"#{attribute}=", params&.dig(attribute) || default_value)
32+
run_callbacks :assign_form_attributes do
33+
params = ActionController::Parameters.new(params) unless params.is_a?(ActionController::Parameters)
34+
attribute_names.each do |attribute|
35+
default_value = self.class._default_attributes[attribute]&.value_before_type_cast
36+
public_send(:"#{attribute}=", params&.dig(attribute) || default_value)
37+
end
3338
end
3439
end
3540

3641
def submit(params)
37-
assign_form_attributes(params)
38-
!!(valid? && perform)
42+
run_callbacks :submit do
43+
assign_form_attributes(params)
44+
!!(valid? && perform)
45+
end
3946
rescue HyperActiveForm::CancelFormSubmit
4047
false
4148
end

spec/hyper_active_form/base_spec.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ def perform
5151
expect(form.age).to eq(nil)
5252
expect(form.hobbies).to eq([])
5353
end
54+
55+
it "runs the assign_form_attributes callback" do
56+
form = dummy_class.new(name: "John", age: 20)
57+
expect(form).to receive(:run_callbacks).with(:assign_form_attributes)
58+
form.assign_form_attributes(name: "Mike")
59+
end
5460
end
5561

5662
describe "#submit" do
@@ -61,6 +67,12 @@ def perform
6167
expect(form.submit(name: "Fred", age: 19)).to eq(true)
6268
end
6369

70+
it "runs the submit callback" do
71+
form = dummy_class.new(name: "John", age: 20, callable:)
72+
expect(form).to receive(:run_callbacks).with(:submit)
73+
form.submit(name: "Fred", age: 19)
74+
end
75+
6476
end
6577

6678
context "when the form is invalid" do

0 commit comments

Comments
 (0)