Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Ruby on Rails (the cool parts)
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Baylor Rae'
January 08, 2013
Programming
130
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ruby on Rails (the cool parts)
This is a presentation I gave that goes over "some" of the cool parts of Ruby on Rails.
Baylor Rae'
January 08, 2013
Other Decks in Programming
See All in Programming
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
310
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
150
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
18
15k
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
100
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
120
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
390
Intent as Code
shoppingjaws
6
1.1k
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
270
FreeBSDでZabbixを動かす
kenkino
0
320
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
570
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
190
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
500
Featured
See All Featured
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
310
Become a Pro
speakerdeck
PRO
31
6.3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Google's AI Overviews - The New Search
badams
0
1.6k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
260
Tell your own story through comics
letsgokoyo
1
1.1k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
610
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Test your architecture with Archunit
thirion
2
2.4k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Transcript
3VCZPO3BJMT the cool parts ( )
8IBU`T$PPM "CPVU3BJMT %BUBCBTF.BOBHFNFOU 5IF"TTFU1JQFMJOF #VJMEJOH8FC'PSNT
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations %POFXJUI3BJMT.JHSBUJPOT w"MMDIBOHFTBSFDSFBUFEJOB3VCZpMF w%BUBCBTF"HOPTUJD w4ZODISPOJ[F&OWJSPONFOUT
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations $ rails g model Product title:string description:text price:decimal
db/migrate/2013010801384833_create_products.rb
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations $ rails g model Product title:string description:text price:decimal
db/migrate/2013010801384833_create_products.rb
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations class CreateProducts < ActiveRecord::Migration def up create_table :products
do |t| t.string :title t.text :description t.decimal :price t.timestamps end end def down drop_table :products end end
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations class CreateProducts < ActiveRecord::Migration def change create_table :products
do |t| t.string :title t.text :description t.decimal :price t.timestamps end end end
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations 1. add_column 2. add_index 3. change_column 4. change_table
5. create_table 6. drop_table 7. remove_column 8. remove_index 9. rename_column
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations 1. add_column :table_name, :column_name, :type 2. add_index, :table_name,
:column_name 3. change_column :table_name, :column_name, :type 4. change_table :table_name, options = {} 5. create_table :table_name, options = {} 6. drop_table :table_name 7. remove_column :table_name, *columns 8. remove_index :table_name, *columns 9. rename_column :table_name, :old_name, :new_name
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations $ rails g migration add_category_id_to_products category_id:integer db/migrate/2013010801448284_add_category_id_to_products.rb
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations class AddCategoryIdToProducts < ActiveRecord::Migration def change add_column :products,
:category_id, :integer end end
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations $ rake db:migrate
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations $ rake db:migrate == CreateProducts: migrating ================================================= --
create_table(:products) -> 0.0055s == CreateProducts: migrated (0.0056s) ======================================== == AddCategoryIdToProducts: migrating ======================================== -- add_column(:products, :category_id, :integer) -> 0.0015s == AddCategoryIdToProducts: migrated (0.0016s) ===============================
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations db/schema.rb ActiveRecord::Schema.define(:version => 2013010801448284) do create_table "products", :force
=> true do |t| t.string "title" t.text "description" t.decimal "price" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.integer "category_id" end end
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations $ rake db:schema:load
%BUBCBTF.BOBHFNFOU http://bit.ly/rails-migrations %POFXJUI3BJMT.JHSBUJPOT w"MMDIBOHFTBSFDSFBUFEJOB3VCZpMF w%BUBCBTF"HOPTUJD w4ZODISPOJ[F&OWJSPONFOUT
w1VMMTpMFTGSPNNVMUJQMFMPDBUJPOTJOUPPOF w3FNPWFTBl+VOL%SBXFSzPG+BWBTDSJQUpMFT w$PNQJMFTBOE$PNQSFTTFTUIFpMFT w"EETBCFUUFSDBDIFJOHTZTUFN 5IF"TTFU1JQFMJOF http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF javascripts !"" bootstrap-dropdown.js !"" bootstrap-modal.js !"" bootstrap-popover.js !"" bootstrap-typeahead.js
!"" content-tabs.js !"" lightbox.js !"" jquery-ui.js !"" jquery-ui.progress-bar.js !"" jquery.anything-slider.js !"" navigation-tabs.js #"" site.js http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF OFVTSBNCMJOHTCMPHTQPUDPN http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF javascripts !"" bootstrap-dropdown.js !"" bootstrap-modal.js !"" bootstrap-popover.js !"" bootstrap-typeahead.js
!"" content-tabs.js !"" lightbox.js !"" jquery-ui.js !"" jquery-ui.progress-bar.js !"" jquery.anything-slider.js !"" navigation-tabs.js #"" site.js http://bit.ly/asset-pipeline
. !"" app $ #"" assets $ !"" javascripts $
#"" stylesheets !"" lib $ #"" assets $ !"" javascripts $ #"" stylesheets #"" vendor #"" assets !"" javascripts #"" stylesheets 5IF"TTFU1JQFMJOF http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF http://bit.ly/asset-pipeline app/assets/js lib/assets/js vendor/assets/js !"" content-tabs.js #"" navigation-tabs.js !""
bootstrap $ !"" dropdown.js $ !"" modal.js $ !"" popover.js $ #"" typeahead.js !"" bootstrap.js !"" lightbox.js !"" jquery-ui.js !"" jquery-ui.progress-bar.js #"" jquery.anything-slider.js #"" site.js
5IF"TTFU1JQFMJOF http://bit.ly/asset-pipeline app/assets/js lib/assets/js vendor/assets/js !"" content-tabs.js #"" navigation-tabs.js !""
bootstrap $ !"" dropdown.js $ !"" modal.js $ !"" popover.js $ #"" typeahead.js !"" bootstrap.js !"" lightbox.js !"" jquery-ui.js !"" jquery-ui.progress-bar.js #"" jquery.anything-slider.js #"" site.js
5IF"TTFU1JQFMJOF http://bit.ly/asset-pipeline //= require bootstrap/dropdown //= require bootstrap/modal //= require
bootstrap/popover //= require bootstrap/typeahead CPPUTUSBQKT
5IF"TTFU1JQFMJOF http://bit.ly/asset-pipeline . #"" app #"" assets !"" javascripts/ #""
stylesheets/ application.js application.css
. #"" app #"" assets !"" javascripts/ #"" stylesheets/ 5IF"TTFU1JQFMJOF
application.js application.css http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF //= require jquery //= require jquery_ujs //= require bootstrap
//= require_tree . /* *= require jquery-ui/datepicker *= require_self *= require_tree . */ application.js application.css http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF http://bit.ly/asset-pipeline <%= javascript_include_tag "application" %>
5IF"TTFU1JQFMJOF
5IF"TTFU1JQFMJOF $ rake assets:precompile http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF $ rake assets:precompile . #"" app #"" assets !""
javascripts/application.js #"" stylesheets/application.css http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF public #"" assets !"" application-1b13569e9620782f423d4cd3ce931750.css !"" application-1b13569e9620782f423d4cd3ce931750.css.gz !"" application-32ed6ebaba49211fc69e08f40c7b97c4.js
!"" application-32ed6ebaba49211fc69e08f40c7b97c4.js.gz !"" application.css !"" application.css.gz !"" application.js !"" application.js.gz !"" manifest.yml !"" rails-a3386665c05a2d82f711a4aaa72d247c.png #"" rails.png http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF public #"" assets !"" application-1b13569e9620782f423d4cd3ce931750.css !"" application-1b13569e9620782f423d4cd3ce931750.css.gz !"" application-32ed6ebaba49211fc69e08f40c7b97c4.js
!"" application-32ed6ebaba49211fc69e08f40c7b97c4.js.gz !"" application.css !"" application.css.gz !"" application.js !"" application.js.gz !"" manifest.yml !"" rails-a3386665c05a2d82f711a4aaa72d247c.png #"" rails.png http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF public #"" assets !"" application-1b13569e9620782f423d4cd3ce931750.css !"" application-1b13569e9620782f423d4cd3ce931750.css.gz !"" application-32ed6ebaba49211fc69e08f40c7b97c4.js
!"" application-32ed6ebaba49211fc69e08f40c7b97c4.js.gz !"" application.css !"" application.css.gz !"" application.js !"" application.js.gz !"" manifest.yml !"" rails-a3386665c05a2d82f711a4aaa72d247c.png #"" rails.png http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF <%= javascript_include_tag "application" %> <script src="/assets/application-32ed6eb...c7b97c4.js"></script> http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF http://bit.ly/asset-pipeline
5IF"TTFU1JQFMJOF $ rake assets:precompile http://bit.ly/asset-pipeline
w1VMMTpMFTGSPNNVMUJQMFMPDBUJPOTJOUPPOF w3FNPWFTBl+VOL%SBXFSzPG+BWBTDSJQUpMFT w$PNQJMFTBOE$PNQSFTTFTUIFpMFT w"EETBCFUUFSDBDIFJOHTZTUFN 5IF"TTFU1JQFMJOF http://bit.ly/asset-pipeline
w$POWFOUJPOPWFS$POpHVSBUJPO w*OUFHSBUFTOJDFMZXJUI"DUJWF3FDPSE w#VJMEDPNQMFYGPSNT #VJMEJOH8FC'PSNT http://bit.ly/rails-forms
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms Product.new({ :title => "Cheese Crackers", :price => 3.99
})
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms Product.new(:title => "Cheese Crackers", :price => 3.99)
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms <form action="/products" method="post"> <!-- title --> <label for="title">Title</label>
<input type="text" name="title" id="title" /> <!-- price --> <label for="price">Price</label> <input type="number" name="price" id="price" /> <!-- doo wop --> <input type="submit">Create Product</input> </form>
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms <%= form_for Product.new do |f| %> <!-- title
--> <%= f.label :title %> <%= f.text_field :title %> <!-- price --> <%= f.label :price %> <%= f.number_field :price %> <!-- doo wop --> <%= f.submit %> <% end %>
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms <!-- title --> <label for="product_title">Title</label> <input type="text" name="product[title]"
id="product_title" /> <!-- price --> <label for="product_price">Price</label> <input type="number" name="product[price]" id="product_price" />
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms <!-- title --> <label for="product_title">Title</label> <input type="text" name="product[title]"
id="product_title" /> <!-- price --> <label for="product_price">Price</label> <input type="number" name="product[price]" id="product_price" />
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms params[:product]
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms params[:product] # {:title=>"My Product", :price=>12.5}
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms params[:product][:title] # "My Product" params[:product] # {:title=>"My Product",
:price=>12.5}
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms Product.new(:title => "My Product", :price => 12.5)
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms # POST /products def create @product = Product.new(params[:product])
end
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms lTUSPOHQBSBNFUFSTz github.com/rails/strong_parameters
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms class ProductsController < ApplicationController # POST /products def
create @products = Product.new(product_params) end private def product_params params.require(:product).permit(:title, :price) end end
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms # product_variation.rb class ProductVariation belongs_to :product end
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms # product.rb class Product has_many :product_variations end
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms <%= form_for @product do |f| %> <ul> <%=
f.fields_for :product_variations do |builder| %> <li> <%= builder.label :title %> <%= builder.text_field :title %> <br /> <%= builder.label :price, "$" %> <%= builder.number_field :price %> </li> <% end %> </ul> <% end %>
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms
#VJMEJOH8FC'PSNT http://bit.ly/rails-forms # product.rb class Product has_many :product_variations accepts_nested_attributes_for :product_variations,
:reject_if => lambda { |a| a[:title].blank? } end
w$POWFOUJPOPWFS$POpHVSBUJPO w*OUFHSBUFTOJDFMZXJUI"DUJWF3FDPSE w#VJMEDPNQMFYGPSNT #VJMEJOH8FC'PSNT http://bit.ly/rails-forms