8. 1 class SignupsController < ApplicationController
2
def new
3
@signup_form = SignUpForm.new
4
end
5
6
def create
7
@signup_form = SignUpForm.new(params)
8
if @signup_form.save
9
redirect_to home_path
10
else
11
render :new
12
end
13
end
14 end
9. 1 class SignUpForm
2
include ActiveModel::Model
3
4
attr_reader :user
5
attr_reader :items
6
7
def initialize(params = {})
8
@user = User.new(user_params(params))
9
@items = build_items(items_params(params))
10
end
11
12
def build_items(items_attributes)
13
items_attributes.map do |attributes|
14
Item.new(attributes)
15
end
16
end
17
18
def user_params(params)
19
params.fetch(:user, {}).slice(:email).to_hash
20
end
21
22
def items_params(params)
23
params.fetch(:user, {}).fetch(:items, {}).values.map do |item_hash|
24
item_hash.slice(:title).to_hash
25
end
26
end
27
28 end
10. 1 class SignUpForm
2
include ActiveModel::Model
3
4
...
5
6
def save
7
valid? && persist
8
end
9
10
validate :at_least_one_item_should_be_presence
12
def at_least_one_item_should_be_presence
13
if @items.empty?
14
errors.add(:items, 'at least one should be present')
14
end
15
end
16
17
def valid?
18
super
19
@user.valid?
20
@items.each(&:valid?)
21
errors.empty? && @user.errors.empty?
22
&& @items.all?{ |item| item.errors.empty? }
23
end
24
25
...
26
27 end
11. 1 class SignUpForm
2
include ActiveModel::Model
3
4
...
18
19
def save
20
valid? && persist
21
end
22
23
...
34
41
private
42
def persist
43
ActiveRecord::Base.transaction do
44
company = Company.create!
45
order = company.orders.create!
46
47
@user.company = company
48
@user.save!
49
50
@items.each do |item|
51
item.order = order
52
item.save!
53
end
54
55
return true
56
end
57
end
58
59
...
87
88 end