8. Contact form recipe
✦ Controller (20 LOC)
José Valim blog.plataformatec.com @josevalim
9. Contact form recipe
✦ Controller (20 LOC)
✦ Model (30 LOC)
José Valim blog.plataformatec.com @josevalim
10. Contact form recipe
✦ Controller (20 LOC)
✦ Model (30 LOC)
✦ View (30 LOC)
José Valim blog.plataformatec.com @josevalim
11. Contact form recipe
✦ Controller (20 LOC)
✦ Model (30 LOC)
✦ View (30 LOC)
✦ Mailer (15 LOC)
José Valim blog.plataformatec.com @josevalim
12. Contact form recipe
✦ Controller (20 LOC)
✦ Model (30 LOC)
✦ View (30 LOC)
✦ Mailer (15 LOC)
✦ View (20 LOC)
José Valim blog.plataformatec.com @josevalim
13. Contact form recipe
✦ Controller (20 LOC)
✦ Model (30 LOC)
✦ View (30 LOC)
✦ Mailer (15 LOC)
✦ View (20 LOC)
José Valim blog.plataformatec.com @josevalim
14. Let’s create a DSL!
José Valim blog.plataformatec.com @josevalim
15. Domain Speci c Language
José Valim blog.plataformatec.com @josevalim
16. class ContactForm < MailForm::Base
to "jose.valim@plataformatec.com.br"
from "contact_form@app_name.com"
subject "Contact form"
attributes :name, :email, :message
end
ContactForm.new(params[:contact_form]).deliver
José Valim blog.plataformatec.com @josevalim
17. from { |c| "#{c.name} <#{c.email}>" }
José Valim blog.plataformatec.com @josevalim
18. to :author_email
def author_email
Author.find(self.author_id).email
end
José Valim blog.plataformatec.com @josevalim
19. headers { |c|
{ "X-Spam" => "True" } if c.honey_pot
}
José Valim blog.plataformatec.com @josevalim
20. class ContactForm < MailForm::Base
to :author_email
from { |c| "#{c.name} <#{c.email}>" }
subject "Contact form"
headers { |c|
{ "X-Spam" => "True" } if c.honey_pot
}
attributes :name, :email, :message
def author_email
Author.find(self.author_id).email
end
end
José Valim blog.plataformatec.com @josevalim
31. class RackApp
def self.call(env)
[200, { "Content-Type" => "text/html"}, ["Hello"]]
end
end
José Valim blog.plataformatec.com @josevalim
32. RackApp = Rack::AppBuilder.new do |env|
status 200
headers "Content-Type" => "text/html"
body ["Hello"]
after_return {
# do something
}
end
José Valim blog.plataformatec.com @josevalim
34. task :process do
# do some processing
end
namespace :app do
task :setup do
# do some setup
#
end
end
rake app:setup
José Valim blog.plataformatec.com @josevalim
35. task :process do
# do some processing
end
namespace :app do
task :setup do
# do some setup
Rake::Task[:process].invoke
end
end
rake app:setup
José Valim blog.plataformatec.com @josevalim
36. class Default < Thor
def process
# do some processing
end
end
class App < Thor
def setup
# do some setup
#
end
end
thor app:setup
José Valim blog.plataformatec.com @josevalim
37. class Default < Thor
def process
# do some processing
end
end
class App < Thor
def setup
# do some setup
Default.new.process
end
end
thor app:setup
José Valim blog.plataformatec.com @josevalim
39. # Rspec
describe User do
it "should be valid" do
User.new(@attributes).should be_valid
end
end
# Test::Unit
class UserTest < Test::Unit::Case
def test_user_validity
assert User.new(@attributes).valid?
end
end
José Valim blog.plataformatec.com @josevalim
41. class UsersController < ApplicationController
def index
@users = User.all
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @users }
end
end
def show
@user = User.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @user }
end
end
def new
@user = User.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @user }
end
end
def edit
@user = User.find(params[:id])
end
Scaffold Controller
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
format.html { redirect_to(@user, :notice => 'User was successfully created.') }
format.xml { render :xml => @user, :status => :created, :location => @user }
else
format.html { render :action => "new" }
format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
end
end
end
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
format.html { redirect_to(@user, :notice => 'User was successfully updated.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@user = User.find(params[:id])
@user.destroy
respond_to do |format|
format.html { redirect_to(users_url) }
format.xml { head :ok }
end
end
end
José Valim blog.plataformatec.com @josevalim
42. class UsersController < ApplicationController
restful!
end
José Valim blog.plataformatec.com @josevalim
43. class UsersController < ApplicationController
restful!
create do
before {
# do something before
}
success.flash "This is the message"
end
create.after do
# do something after
end
end
José Valim blog.plataformatec.com @josevalim
45. class UsersController < InheritedResources::Base
def create
# do something before
flash[:success] = "This is the message"
super
# do something after
end
end
José Valim blog.plataformatec.com @josevalim
53. # DSL
class User < ActiveRecord::Base
after_save :deliver_notification, :unless => :admin?
end
# NoDSL
class User < ActiveRecord::Base
def save(*)
if super
deliver_notification unless admin?
end
end
end
José Valim blog.plataformatec.com @josevalim