formobject for building complex forms. dmytro pilugin

16
FormObject for building complex forms Dmytro Piliugin @suaron dmytro.piliugin@gmai l.com

Upload: sphere-consulting-inc

Post on 14-Jan-2015

147 views

Category:

Technology


0 download

DESCRIPTION

Kiev-rb#2

TRANSCRIPT

Page 1: FormObject For Building Complex Forms. Dmytro Pilugin

FormObject for building complex

forms

Dmytro Piliugin@suaron

[email protected]

Page 2: FormObject For Building Complex Forms. Dmytro Pilugin

MVC

ModelModel ControllerController ViewView

Page 3: FormObject For Building Complex Forms. Dmytro Pilugin

MVC

ModelModel ControllerController ViewView

Page 4: FormObject For Building Complex Forms. Dmytro Pilugin

MVC

ModelModel ControllerController ViewView

FromObjectFromObject

Page 5: FormObject For Building Complex Forms. Dmytro Pilugin
Page 6: FormObject For Building Complex Forms. Dmytro Pilugin
Page 7: FormObject For Building Complex Forms. Dmytro Pilugin
Page 8: FormObject For Building Complex Forms. Dmytro Pilugin

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_path10 else11 render :new12 end13 end14 end

Page 9: FormObject For Building Complex Forms. Dmytro Pilugin

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

Page 10: FormObject For Building Complex Forms. Dmytro Pilugin

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_presence12 def at_least_one_item_should_be_presence13 if @items.empty?14 errors.add(:items, 'at least one should be present')14 end15 end16 17 def valid?18 super19 @user.valid?20 @items.each(&:valid?)21 errors.empty? && @user.errors.empty? \22 && @items.all?{ |item| item.errors.empty? }23 end24 25 ...2627 end

Page 11: FormObject For Building Complex Forms. Dmytro Pilugin

1 class SignUpForm 2 include ActiveModel::Model 3 4 ...18 19 def save20 valid? && persist21 end22 23 ...3441 private42 def persist43 ActiveRecord::Base.transaction do44 company = Company.create!45 order = company.orders.create!46 47 @user.company = company48 @user.save!49 50 @items.each do |item|51 item.order = order52 item.save!53 end54 55 return true56 end57 end58 59 ...8788 end

Page 12: FormObject For Building Complex Forms. Dmytro Pilugin

41 private42 def persist43 ActiveRecord::Base.transaction do44 company = Company.create!45 order = company.orders.create!46 47 @user.company = company48 @user.save!49 50 @items.each do |item|51 item.order = order52 item.save!53 end54 55 AdminMailer.delay.notify(order.id)56 57 return true58 end59 end

Page 13: FormObject For Building Complex Forms. Dmytro Pilugin

41 private42 def persist43 ActiveRecord::Base.transaction do44 company = Company.create!45 order = company.orders.create!46 47 @user.company = company48 @user.save!49 50 @items.each do |item|51 item.order = order52 authorize_and_save(item)53 end54 55 return true56 end57 end58 59 def authorize_and_save(object)60 if current_ability.can?(:create, object)61 object.save!62 else63 errors.add(:security, "not authorised")64 raise ActiveRecord::Rollback65 end66 end

Page 14: FormObject For Building Complex Forms. Dmytro Pilugin

slides: https://speakerdeck.com/suaron/formobject-for-building-complex-forms

/code: http://github.com/suaron/fo

Page 15: FormObject For Building Complex Forms. Dmytro Pilugin

References

• http://railscasts.com/episodes/416-form-objects

• http://matthewrobertson.org/blog/2012/09/20/decoupling-rails-forms-from-the-database/

• http://robots.thoughtbot.com/activemodel-form-objects

• http://pivotallabs.com/form-backing-objects-for-fun-and-profit/

Page 16: FormObject For Building Complex Forms. Dmytro Pilugin

Q/A