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 / 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 / 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 / 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-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-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 / 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 / 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_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
class PronounceablePassword
WORDS = (IO.readlines(File.join File.dirname(__FILE__), 'words.txt')).each { |w| w.chop! }
class << self
def random_pronouncable_password(options={})
options={
:rand_seed => 999
}.update(options)
words = WORDS.dup
[words.delete_at(rand(words.length)), rand(options[:rand_seed]), words[rand(words.length)]].join("-")
@ryenski
ryenski / numbers.rb
Created May 4, 2017 15:45
kata: Write a function named numbers that returns true if all the parameters it is passed are a number. Otherwise return false.
# numbers.rb
def numbers(*ary)
ary.all?{|a| a.is_a?(Numeric)}
end
numbers(1,2,3.0)
# => true
numbers(1,2,'foo')
# => false