hanami - Base repository, CLI
router - Rack compatible HTTP router for Ruby
controller - Full featured and fast actions for Rack
utils - Ruby core extensions and class utilities
model - Persistence with entities and repositories
Slide 51
Slide 51 text
validations - Validations mixin for Ruby objects
helpers - View helpers for Ruby applications
view - Presentation with a separation
assets - Assets management for Ruby
mailer - Mail for Ruby applications
Slide 52
Slide 52 text
Differences
Slide 53
Slide 53 text
# rack
class HelloApp
def call(env)
[200, { **env }, ['Hello!']]
end
end
Slide 54
Slide 54 text
# hanami-router
class HelloApp
def call(env)
[200, { **env }, ['Hello!']]
end
end
router = Hanami::Router.new
router.get '/', to: 'hello_app'
Slide 55
Slide 55 text
# sinatra
class Hello < Sinatra
get '/' do
'Hello!'
end
end
Slide 56
Slide 56 text
# hanami
Hanami::Router.new do
get '/' do
[200, { **env }, ['Hello!']]
end
end
Slide 57
Slide 57 text
Rails and Hanami
Slide 58
Slide 58 text
Controllers
Slide 59
Slide 59 text
class UsersController < AC
def new
end
def send_sms
end
private
def user_params
end
end
Controllers: Rails
Slide 60
Slide 60 text
Controllers: hanami action
module Web::Controllers::Board
class Index
include Web::Action
params do
required(:email).filled
end
def call(params)
end
end
end
Slide 61
Slide 61 text
Controllers: hanami
module Web::Controllers::Board
class Index
include Web::Action
params do
required(:email).filled
end
def call(params)
end
end
end
Slide 62
Slide 62 text
Controllers: hanami
module Web::Controllers::Board
class Index
include Web::Action
params do
required(:email).filled
end
def call(params)
end
end
end
Slide 63
Slide 63 text
Model
Slide 64
Slide 64 text
class User < ActiveRecord::Base
include Gravtastic
before_destroy :yank_gems
has_many :rubygems, through: :ownerships
validates :name, presence: true
# ...
end
Model: Rails
Slide 65
Slide 65 text
class User < ActiveRecord::Base
include Gravtastic
before_destroy :yank_gems
has_many :rubygems, through: :ownerships
validates :name, presence: true
# ...
end
Model: Rails
Slide 66
Slide 66 text
class User < ActiveRecord::Base
include Gravtastic
before_destroy :yank_gems
has_many :rubygems, through: :ownerships
validates :name, presence: true
# ...
end
Model: Rails
Slide 67
Slide 67 text
class User < ActiveRecord::Base
include Gravtastic
before_destroy :yank_gems
has_many :rubygems, through: :ownerships
validates :name, presence: true
# ...
end
Model: Rails
Slide 68
Slide 68 text
class User < ActiveRecord::Base
include Gravtastic
before_destroy :yank_gems
has_many :rubygems, through: :ownerships
validates :name, presence: true
# ...
end
Model: Rails
Slide 69
Slide 69 text
Model: hanami
hanami + ROM = ❤
rom-rb.org
Slide 70
Slide 70 text
Model: hanami entity
class User < Hanami::Entity
# ...
end
Slide 71
Slide 71 text
Model: hanami entity
>> user = User.new(id: 1)
=> #1}>
>> user.id
=> 1
>> user.id = 1
NoMethodError: undefined method `id=' for
#1}>
Did you mean? id
Slide 72
Slide 72 text
Model: hanami entity
>> user = User.new(id: 1)
=> #1}>
>> user.id
=> 1
>> user.id = 1
NoMethodError: undefined method `id=' for
#1}>
Did you mean? id
Slide 73
Slide 73 text
Model: hanami entity
>> user = User.new(id: 1)
=> #1}>
>> user.id
=> 1
>> user.id = 1
NoMethodError: undefined method `id=' for
#1}>
Did you mean? id
Slide 74
Slide 74 text
class UserRepository < Hanami::Repository
associations do
has_many :books
end
def find_by_name(name)
users # => ROM relation
users.where(name: name).limit(1).order { id }.one
end
end
Model: hanami repository
module Web::Controllers::Board
class Index
include Web::Action
def call(params)
end
end
end
Slide 83
Slide 83 text
Action test
describe Web::Controllers::Board::Index do
let(:action){ Board::Index.new }
let(:params){ Hash[] }
it 'is successful' do
response = action.call(params)
response[0].must_equal 200
end
end
Slide 84
Slide 84 text
Action test
describe Web::Controllers::Board::Index do
let(:action){ Board::Index.new }
let(:params){ Hash[] }
it 'is successful' do
response = action.call(params)
response[0].must_equal 200
end
end
Slide 85
Slide 85 text
Action test
describe Web::Controllers::Board::Index do
let(:action){ Board::Index.new }
let(:params){ Hash[] }
it 'is successful' do
response = action.call(params)
response[0].must_equal 200
end
end