$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Lotus
Search
Luca Guidi
October 14, 2014
Programming
8
550
Lotus
Lotus: a complete web framework for Ruby.
Luca Guidi
October 14, 2014
Tweet
Share
More Decks by Luca Guidi
See All by Luca Guidi
Functional Web with Hanami
jodosha
4
430
Lessons Learned While Building Hanami
jodosha
4
1.1k
Lotus RubyDay 2015
jodosha
2
910
Lotus For Rails Developers
jodosha
2
310
Lotus - Brighton Ruby 2015
jodosha
3
890
A Rails Criticism
jodosha
4
1.7k
Other Decks in Programming
See All in Programming
AIコーディングエージェント(skywork)
kondai24
0
210
ゆくKotlin くるRust
exoego
1
160
生成AIを利用するだけでなく、投資できる組織へ
pospome
2
410
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
200
SwiftUIで本格音ゲー実装してみた
hypebeans
0
500
実は歴史的なアップデートだと思う AWS Interconnect - multicloud
maroon1st
0
270
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
3
620
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
160
GoLab2025 Recap
kuro_kurorrr
0
780
著者と進める!『AIと個人開発したくなったらまずCursorで要件定義だ!』
yasunacoffee
0
160
Grafana:建立系統全知視角的捷徑
blueswen
0
230
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
180
Featured
See All Featured
Getting science done with accelerated Python computing platforms
jacobtomlinson
0
79
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
31
The Limits of Empathy - UXLibs8
cassininazir
1
190
For a Future-Friendly Web
brad_frost
180
10k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
110
Agile that works and the tools we love
rasmusluckow
331
21k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
2
3.8k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
170
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
760
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
How to Ace a Technical Interview
jacobian
281
24k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
1
210
Transcript
Lotus A c o mp l e t e web
framework @jodosha / #lotusrb
None
Do we need yet another web framework?
Are you reinventing the wheel?
What if we never reinvented the wheel?
The wheel
None
We reinvented the wheel after observing it
Complexity should be managed, not hidden.
Why does this matter?
The ultimate goal is…
Money https://flic.kr/p/aFAEHR
Use case: http://bit.ly/github-rails-upgrade
We should not trade control for convenience.
Cost of maintenance 0 20 40 60 80 Years 0
1 2 3 Covenience Simplicity
Silver bullets are a lie.
Philosophy
Standalone frameworks
Full stack applications
Few conventions More objects No monkey- patching
Few conventions More objects No monkey- patching
Few conventions More objects No monkey- patching
Simple
Simplicity is achieved by removing what isn’t essential
Coffee https://flic.kr/p/6rX8pn
Convenient https://flic.kr/p/93Bk4K
Simple https://flic.kr/p/mn57Zm
The output https://flic.kr/p/9oG93w
Lotus doesn’t enable optional features by default
We perceive as simple the things we are familiar with
BookRepository.find 23
Rails.application.routes.draw do get '/' => 'home#index', as: :home resources :books
end ! Rails.application.routes # => ???
router = Lotus::Router.new do get '/', to: 'home#index', as: :home
resources :books end ! router.path(:home) # => '/' router.call(env) # Rack env run router # in config.ru
Fast
Micro benchmarks http://bit.ly/lotus-micro-bench
HTTP benchmarks http://bit.ly/lotus-http-bench
Rails 1027.73 Sinatra 2207.73 Lotus 4175.90 http://bit.ly/lotus-http-bench req/s
Rails 1027.73 Sinatra 2207.73 Lotus 4175.90 http://bit.ly/lotus-http-bench req/s
Rails 1027.73 Sinatra 2207.73 Lotus 4175.90 http://bit.ly/lotus-http-bench req/s
Testable
Testability is a virtue
There is no “test-damaged” design
class Show include Lotus::Action ! expose :book ! def initialize(repository
= BooksRepository) @repository = repository end ! def call(params) @book = @repository.find params[:id] end end
book = Object.new repository = Minitest::Mock.new repository.expect(:find, book, [Integer]) !
action = Show.new(repository) action.call(id: 23) # => [200, {}, nil] ! repository.verify action.book.must_equal book # assigns(:book) isn’t needed
Demo
The future
Get involved
lotusrb.org #lotusrb @jodosha
Q&A
Thank you!