Skip to content

Instantly share code, notes, and snippets.

View ryenski's full-sized avatar
🎯
Focusing

Ryan Heneise ryenski

🎯
Focusing
  • Austin, TX
View GitHub Profile
@ryenski
ryenski / sti_opt_ins_controller.rb
Last active June 6, 2017 16:27
Example controller using Single Table Inheritance
class OptInsController < FormsController
private
def skope
current_user.opt_ins
end
def form_params
params[:form] = params[:opt_in]
params.require(:form).permit(permitted_params)
end
@ryenski
ryenski / sti_forms_controller.rb
Last active June 6, 2017 16:28
Example base controller using STI.
class FormsController < ApplicationController
before_action :set_form, only: [:show, :edit, :update, :destroy, :embed, :customize]
# GET /forms
# GET /forms.json
def index
@forms = skope.newest_first
respond_to do |format|
format.html
format.json { render json: @forms }
@ryenski
ryenski / sti_lead_magnets_controller.rb
Created June 6, 2017 16:27
Example controller using Single Table Inheritance
class LeadMagnetsController < FormsController
private
def skope
current_user.lead_magnets
end
def form_params
params[:form] = params[:lead_magnet]
params.require(:form).permit(permitted_params)
end
@ryenski
ryenski / ServiceObjects-initializing.rb
Created June 27, 2017 17:34
Initializing a service object.
class UserCreator
def initialize(params)
@user = User.new(params)
end
private
attr_reader :user
end
@ryenski
ryenski / ServiceObjects-calling.rb
Created June 27, 2017 18:25
Calling a service object
class UserCreator
# ...
# UserCreator.new(params).call
def call
do_the_work(args)
end
# Alternatively some people think this reads nicer:
# UserCreateor.call(params)
def self.call(*args)
new(*args).call
@ryenski
ryenski / ServiceObjects-returning.rb
Last active June 27, 2017 18:35
Returning a consistent result object
class WidgetCreator
# ...
attr_reader :widget, :success, :errors
def result
OpenStruct.new(success?: !errors, errors: errors.try(:flatten), widget: widget)
end
end
widget_creator = WidgetCreator.new(params).call
widget_creator.success?
@ryenski
ryenski / ServiceObjects-processing.rb
Created June 27, 2017 18:38
Processing service objects
class MessageCreator
# ...
def call
process!
return result
end
private
def process!
if message.save
@ryenski
ryenski / tenant_creator.rb
Last active June 27, 2017 18:47
Calling other service objects
class TenantCreator
def initialize(user_name, email, company_name)
@tenant = Tenant.new(name: company_name)
@user = @tenant.users.new(name: user_name, email: email)
end
def call
if persist!
SignupMailer.welcome(user).deliver_now
AnalyticsTracker.new(tenant).call
@ryenski
ryenski / signups_controller.rb
Created June 27, 2017 18:58
Calling TenantCreator service object in SignupController
class SignupsController < ActionController::Base
def create
@signup = TenantCreator.new(signup_params)
if @signup.call
redirect_to welcome_url(account_id: @signup.tenant.subdomain, auth_token: @signup.user.auth_token)
else
flash.now[:error] = @signup.errors.full_messages.join(', ')
render action: :index
end
end
@ryenski
ryenski / comment_creator_test.rb
Created June 27, 2017 19:05
Testing service objects
describe CommentCreator do
it 'should persist record' do
assert_difference 'Comment.count', +1 do
CommentCreator.new(comment_params).call
end
end
end