16. # contenu de hello.rb
require "sinatra"
get "/" do
"Hello world."
end
$ ruby -rubygems hello.rb
=> == Sinatra/1.2 has taken the stage on 4567…
$ curl http://localhost:4567/
=> Hello world.
23. # contenu de config.ru
class RackApp
def call(env)
[200, { "Content-type" => "text/html" }, "Hello world."]
end
end
run RackApp.new
$ rackup --env development
=> INFO WEBrick::HTTPServer#start: pid=37743 port=9292
$ curl http://localhost:9292/
=> Hello world.
24. # contenu de blogue.rb
require "sinatra"
class Blogue < Sinatra::Base
# Code l’application Sinatra
end
# contenu de config.ru
require "blogue"
run Blogue.new
25. # contenu de blogue.rb
require "sinatra"
# Code l’application Sinatra au premier niveau
# contenu de config.ru
require "blogue"
run Sinatra::Application
34. get "/auteur/:username" do
"Les billets de #{params[:username]}"
end
delete "/articles/:id" do
"Suppression de l’article #{params[:id]}"
end
put "/articles/:id" do |id|
"Modification de l’article #{id}"
end
36. get "/fichiers/*.*" do
# GET /fichiers/images/2011/03/foo.jpg
# params[:splat] => ["/images/2011/03/foo", ".jpg"]
end
get "/*" do
# GET /url/inconnu
# params[:splat] => ["url/inconnu"]
end
38. get /^/(d{4})$/ do |annee|
"Les articles de l’année #{annee}"
# params["captures"] => [annee]
end
get %r{^(d{4})/(d{2})$} do |annee, mois|
"Les articles du mois #{mois} de #{annee}"
# params["captures"] => [annee, mois]
end
# seulement ruby 1.9
get %r{^(?<annee>d{4})/(?<mois>d{2})$} do
"Les articles du mois #{params[:mois]} de #{params[:annee]}"
end
40. get "/", :agent => /msie [w.]+/i do
"Page d’accueil pour Internet Explorer"
end
get "/" do
"Page d’accueil pour les autres user-agents"
end
41. set(:secret) do |value|
condition { params.include?(:secret) == value }
end
get "/", :secret => true do
"Page d’accueil secrète!"
end
get "/" do
"Page d’accueil régulière."
end
50. before "/admin/*" do
halt(401, "Vous voulez hacker ce blogue?") unless authenticate!
end
get "/admin/dashboard" do
"Tableau de bord de quelqu’un d’authentifié"
end
post "/admin/billets" do
"Création d’un billet par quelqu’un d’authentifié"
end
51. before "/compte/*" do
@user = User.find(session[:user_id])
end
get "/compte/photo" do
"Formulaire de modification de la photo de #{@user}"
end
get "/compte/motdepasse" do
"Formulaire de modification du mot de passe de #{@user}"
end
52. before :agent => /msie 6.0/i do
@message = "Vous utilisez un navigateur dépassé…"
end
60. get "/" do
haml :index
end
get "/css/screen.css" do
sass :screen
end
get "/api/articles.xml" do
nokogiri :"api/articles"
end
get "/api/articles.json" do
coffee :"api/articles"
end
65. enable :inline_templates
get "/" do
haml :index
end
__END__
@@ layout
!!!
%html
%body
=yield
@@ index
%h1 Bienvenue sur mon blogue.
66. template :layout do
"!!!n%htmln%bodyn=yieldn"
end
template :index do
"%h1 Bienvenue sur mon blogue."
end
get "/" do
haml :index
end
67. get "/" do
haml "!!!n%body Bienvenue sur mon blogue."
end
68. Templates
Externes
Stockés en tant que fichiers
69. get "/" do
haml :index # /views/index.haml
end
get "/css/screen.css" do
sass :screen # /views/screen.sass
end
get "/api/articles.xml" do
builder :"api/articles"# /views/api/articles.builder
end
get "/api/articles.json" do
coffee :"api/articles" # /views/api/articles.coffee
end
72. get "/" do
haml :index
# template: views/index.haml
# layout: views/layout.haml
end
get "/article/:id" do
@article = Article.find(params[:id])
markdown :article, :layout_engine => :haml
# template: views/article.markdown
# layout: views/layout.haml
end
get "/ajax/article/:id.html" do
@article = Article.find(params[:id])
haml :article, :layout => false
# template: views/article.haml
# layout: n/a
end
73. Templates
Données
Les utiliser dans les templates
74. get "/" do
@articles = Article.all
haml :index
end
-# contenu de index.haml
.hfeed
- @articles.each do |article|
.entry
%h1= article.titre
.entry-content
= markdown(article.contenu)
75. get "/" do
articles = Article.all
haml :index, :locals => { :articles => articles }
end
-# contenu de index.haml
.hfeed
- articles.each do |article|
.entry
%h1= article.titre
.entry-content
= markdown(article.contenu)
76. get "/" do
@articles = Article.all
haml :index
end
-# contenu de index.haml
.hfeed
- @articles.each do |article|
.entry
= haml :article, :locals => { :article => article }
-# contenu de article.haml
.entry
%h1= article.titre
.entry-content
= markdown(article.contenu)
78. helpers do
def heading(level, text)
"<h#{level}>#{text}</h#{level}>"
end
end
%h1 Derniers articles
%ul.articles
- @articles.each do |article|
%li
=heading(2, article.title)
79. helpers do
def link_to(path, text)
path = "#{request.host}#{path}" if request.xhr?
"<a href="#{path}">#{text}</a>"
end
end
def other_link_to(path, text)
# n’a pas accès à `request`
"<a href="#{path}">#{text}</a>"
end
%h1 Bienvenue
%p= link_to "/", "Accueil"
%p= other_link_to "/", "Accueil encore"
83. configure do
DataMapper.setup :default, ENV["DATABASE_URL"]
DataMapper::Pagination.defaults[:per_page] = 20
DataMapper::Logger.new $stdout, :debug
end
get "/" do
@articles = Article.all
haml :index
end
85. $ rackup --env development
=> INFO WEBrick::HTTPServer#start: pid=37743 port=9292
$ rackup --env production
=> INFO WEBrick::HTTPServer#start: pid=37743 port=9292
$ shotgun --env development
== Shotgun/WEBrick on http://127.0.0.1:9393/
$ thin start --env production
>> Thin web server (v1.2.8 codename Black Keys)
>> Listening on 0.0.0.0:3000, CTRL+C to stop
86. configure :development do
set :scss, :style => :expanded
set :haml, :ugly => false
end
configure :production do
set :scss, :style => :compressed
set :haml, :ugly => true
end
87. configure :development, :test do
set :s3, { :bucket => "blogue-dev", :key => "efg456" }
end
configure :production do
set :s3, { :bucket => "blogue", :key => "abc123" }
end
get "/" do
"La valeur de s3/bucket est de #{settings.s3[:bucket]}"
end
104. enable :sessions
before "/admin/*" do
unless session[:admin]
halt "Vous devez être <a href="/login">connecté</a>."
end
end
get "/login" do
haml :login
end
post "/login" do
if params[:username] == "foo" and params[:password] == "bar"
session[:admin] = true
redirect "/admin"
end
end
106. before do
unless request.cookies.include?("deja_venu_ici")
response.set_cookies("deja_venu_ici", {
:value => true,
:expires => Time.now + (60*60*24*365)
})
@nouveau_visiteur = true
end
end
get "/" do
haml :index # peut utiliser @nouveau_visiteur
end
110. require "blogue"
require "test/unit"
require "rack/test"
class BlogueTest < Test::Unit::TestCase
include Rack::Test::Methods
def app; Blogue; end
def test_page_accueil
get "/"
assert_equal "Page d’accueil du blogue", last_response.body
end
end
111. require "blogue"
require "test/unit"
require "rack/test"
class BlogueTest < Test::Unit::TestCase
include Rack::Test::Methods
def app; Blogue; end
def test_redirection_mauvais_acces_au_tableau_de_bord
get "/admin/dashboard"
assert_equal "/admin/login", last_request.url
assert last_response.ok?
end
def test_redirection_connexion_au_tableau_de_bord
post "/admin/login", :username => "foo", :password => "bar"
assert_equal "/admin/dashboard", last_request.url
assert last_response.ok?
end
end
112. $ ruby test.rb
=> Loaded suite test
Started
..
Finished in 0.009936 seconds.
2 tests, 2 assertions, 0 failures, 0 errors