Skip to content

Commit 636b9f6

Browse files
committed
Redo FormDefinition relationship with other parts.
1 parent 8006646 commit 636b9f6

File tree

6 files changed

+23
-60
lines changed

6 files changed

+23
-60
lines changed

lib/active_form/base.rb

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def association(name, options = {}, &block)
4444
define_method(name) { instance_variable_get("@#{name}").models }
4545
define_method("#{name}_attributes=") {}
4646

47-
forms << FormDefinition.new(name, block, options)
47+
forms << [name, options, block]
4848
end
4949

5050
def forms
@@ -60,11 +60,10 @@ def model_class
6060
private
6161

6262
def populate_forms
63-
self.class.forms.each do |definition|
64-
definition.parent = model
65-
definition.to_form.tap do |nested_form|
66-
forms << nested_form
67-
instance_variable_set("@#{definition.assoc_name}", nested_form)
63+
self.class.forms.each do |(name, options, block)|
64+
FormDefinition.new(name, block, options).build_for(model).tap do |form|
65+
forms << form
66+
instance_variable_set("@#{name}", form)
6867
end
6968
end
7069
end

lib/active_form/form.rb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ class Form < AbstractForm
55
delegate :id, :_destroy, :persisted?, to: :model
66
attr_reader :association_name, :parent, :model, :proc
77

8-
def initialize(assoc_name, parent, proc, model=nil)
8+
def initialize(assoc_name, parent, proc, options = {})
99
@association_name = assoc_name
1010
@parent = parent
11+
12+
model = options unless options.is_a?(Hash)
1113
@model = model || build_model
14+
1215
@forms = []
1316
instance_eval(&proc) if proc
1417
enable_autosave
@@ -22,11 +25,9 @@ def association(name, options = {}, &block)
2225
define_singleton_method(name) { instance_variable_get("@#{name}").models }
2326
define_singleton_method("#{name}_attributes=") {}
2427

25-
definition = FormDefinition.new(name, block, options)
26-
definition.parent = @model
27-
definition.to_form.tap do |nested_form|
28-
forms << nested_form
29-
instance_variable_set("@#{name}", nested_form)
28+
FormDefinition.new(name, block, options).build_for(@model).tap do |form|
29+
forms << form
30+
instance_variable_set("@#{name}", form)
3031
end
3132
end
3233

lib/active_form/form_definition.rb

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,19 @@
11
module ActiveForm
22
class FormDefinition
3-
attr_accessor :assoc_name, :proc, :parent, :records
3+
attr_reader :assoc_name
44

5-
def initialize(assoc_name, block, options={})
5+
def initialize(assoc_name, block, options)
66
@assoc_name = assoc_name
7-
@proc = block
8-
@records = options[:records]
7+
@block = block
8+
@options = options
99
end
1010

11-
def to_form
12-
macro = association_reflection.macro
13-
14-
case macro
15-
when :has_one, :belongs_to
16-
Form.new(assoc_name, parent, proc)
17-
when :has_many
18-
CollectionForm.new(assoc_name, parent, proc, {records: records})
19-
end
20-
end
21-
22-
private
23-
24-
def association_reflection
25-
parent.class.reflect_on_association(@assoc_name)
11+
def build_for(model)
12+
if model.class.reflect_on_association(@assoc_name).macro == :has_many
13+
CollectionForm
14+
else
15+
Form
16+
end.new(@assoc_name, model, @block, @options)
2617
end
2718
end
28-
29-
end
19+
end

test/forms/nested_model_form_test.rb

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,6 @@ def setup
2020
assert_respond_to UserWithEmailFormFixture, :forms
2121
end
2222

23-
test "forms list contains form definitions" do
24-
email_definition = UserWithEmailFormFixture.forms.first
25-
26-
assert_equal :email, email_definition.assoc_name
27-
end
28-
2923
test "contains getter for email sub-form" do
3024
assert_respond_to @form, :email
3125
assert_instance_of ActiveForm::Form, @form.email

test/forms/nested_models_form_test.rb

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,9 @@ def setup
1313
end
1414

1515
test "declares both sub-forms" do
16-
assert_equal 2, UserWithEmailAndProfileFormFixture.forms.size
1716
assert_equal 2, @form.forms.size
1817
end
1918

20-
test "forms list contains profile sub-form definition" do
21-
profile_definition = UserWithEmailAndProfileFormFixture.forms.last
22-
23-
assert_equal :profile, profile_definition.assoc_name
24-
end
25-
2619
test "profile sub-form contains association name and parent" do
2720
assert_equal :profile, @profile_form.association_name
2821
assert_equal @user, @profile_form.parent

test/forms/project_form_test.rb

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,6 @@ def setup
2727
assert_respond_to ProjectFormFixture, :association
2828
end
2929

30-
test "forms list contains sub-form definitions" do
31-
assert_equal 4, ProjectFormFixture.forms.size
32-
33-
tasks_definition = ProjectFormFixture.forms[0]
34-
contributors_definition = ProjectFormFixture.forms[1]
35-
project_tags_definition = ProjectFormFixture.forms[2]
36-
owner_definition = ProjectFormFixture.forms[3]
37-
38-
assert_equal :tasks, tasks_definition.assoc_name
39-
assert_equal :contributors, contributors_definition.assoc_name
40-
assert_equal :project_tags, project_tags_definition.assoc_name
41-
assert_equal :owner, owner_definition.assoc_name
42-
end
43-
4430
test "project form provides getter method for tasks sub-form" do
4531
assert_instance_of ActiveForm::CollectionForm, @tasks_form
4632
end

0 commit comments

Comments
 (0)