merb.intro     :by  =>    "Paul Barry" "Paul Barry"
What is Merb? A Ruby MVC Web Framework similar to Rails, but: •  Small •  Fast •  Light •  Less Opinionated
Create Your App $ merb-gen app blog ~/projects
Configure Your App config/init.rb use_orm  :activerecord dependency  "merb-action-args" dependency  "merb-assets" dependency  "merb-builder" dependency  "merb-parts" dependency  "merb_activerecord" dependency  "merb_helpers"
Configure Your Database config/database.yml development: adapter: sqlite3 database: dev.db timeout: 5000 test: adapter: sqlite3 database: test.db timeout: 5000
Generate a Model $ merb-gen model article title:string body:text ~/projects/blog
Create the Table $ rake db:migrate ~/projects/blog
Create an Article $ merb -i >> article = Article.new(:title => 'First Post')‏ => #<Article id: nil...> >> article.body = 'Lorem ipsum dolor sit amet...' => &quot;Lorem ipsum dolor sit amet...&quot; >> article.save!=> true ~/projects/blog
Create a Controller app/controllers/articles.rb class   Articles  < Application def   index &quot;Hello, World!&quot; end end
Create RESTful Route config/router.rb Merb :: Router .prepare  do  | r | r.resources  :articles end
Start Merb $ merb ~/projects/blog
View the controller
Named Route config/router.rb r.match( &quot;/sleep/:time&quot; ).to( :controller  =>  &quot;sleeper&quot; ,  :action  =>  &quot;execute&quot; ).name( :sleeper )‏
Blocking Controller app/controllers/sleeper.rb class   Sleeper  < Application def   execute (time = 5 )‏ sleep time.to_i &quot;I slept for  #{time}  seconds&quot; end end
Non-Blocking Controller app/controllers/sleeper.rb class   Sleeper  < Application def   execute (time = 5 )‏ render_deferred  do sleep time.to_i &quot;I slept for  #{time}  seconds&quot; end end end
Demo
Create a Real Action app/controllers/articles.rb class   Articles  < Application def   index @articles   =   Article .find( :all ,  :limit  =>  5 ,  :order  =>  &quot;created_at desc&quot; )‏ display  @articles end end
Create the View app/views/articles/index.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <% throw_content  :page_title ,  &quot;Articles&quot;  %> <% throw_content  :sidebar   do  %> <%= partial  'shared/me'  %> <%  end  %> <%= partial  'article' ,  :with  =>  @articles  %>
Create the Partial app/views/articles/_article.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <div id= &quot;article_ <%= article.id %> &quot;  class= &quot;article&quot; > <h2> <%= link_to h(article.title), url( :article , article) %> </h2> <p class= &quot;posted_at&quot; > Posted at <%= article.created_at.strftime  &quot;%l:%M %p&quot;  %>  on  <%= article.created_at.strftime  &quot;%A, %B %e&quot;  %> <p> <%= h(article.body) %> </p> </div>
Create the Shared Partial app/views/shared/_me.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <h2> About Me </h2> <%= image_tag  &quot;me.jpg&quot;  %>
Create the Layout app/views/layout/articles.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <html> <head> <title> Merb Blog - <%= catch_content  :page_title  %> </title> <%= css_include_tag  'application'  %> <%= catch_content  :html_head  %> </head> <body> <div id= &quot;page&quot; > <div id= &quot;header&quot; ><h1> Merb Blog </h1></div> <div id= &quot;content&quot; > <%= catch_content %> </div> <div id= &quot;sidebar&quot; > <%= catch_content  :sidebar  %> </div> </div> </body> </html>
View Articles
Create the Show Action app/controllers/articles.rb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> def   show (id)‏ @article   =   Article .find_by_id(id)‏ raise   NotFound   unless   @article display  @article end
Create the Show View app/views/show.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <% throw_content  :page_title , h( @article .title) %> <% throw_content  :sidebar   do  %> <%= partial  'shared/me'  %> <%  end  %> <%= partial  'article' ,  :with  =>  @article  %>
View Article <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
Add RSS Mime Type config/init.rb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> Merb .add_mime_type  :rss ,  nil ,  %w[text/xml]
Add RSS to Provides app/controllers/articles.rb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> class   Articles  < Application provides  :rss def   index @articles   =   Article .find( :all ,  :limit  =>  5 ,  :order  =>  &quot;created_at desc&quot; )‏ display  @articles end   end
Create RSS Builder app/views/articles/index.rss.builder <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> xml.instruct!  :xml ,  :version  =>  &quot;1.0&quot;   xml.rss  :version  =>  &quot;2.0&quot;   do xml.channel  do xml.title  &quot;Merb Blog&quot; xml.description  &quot;The greatest blog in the world&quot; xml.link  &quot; http://merb.blog &quot; @articles .each  do  | a | xml.item  do xml.title a.title xml.description a.body xml.pubDate a.created_at.to_s( :rfc822 )‏ xml.link url( :article , a)‏ xml.guid url( :article , a)‏ end end end end
Add Auto-Discovery Link app/views/articles/index.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <% throw_content  :html_head   do  %> <link rel= &quot;alternate&quot;  type= &quot;application/rss+xml&quot;   title= &quot;RSS&quot;  href= &quot;/articles.rss&quot;  /> <%  end  %>
RSS Icon <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
RSS Feed <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
Create Recent Article Part <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> class   RecentArticles  < Merb::PartController def   index @articles   =   Article .find( :all ,  :limit  => params[ :limit ],  :order  =>  'created_at desc' )‏ render end end app/parts/recent_articles.rb
Recent Article Part View <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/parts/views/recent_articles/index.html.erb <h2> Recent Articles </h2> <ul> <%  @articles .each  do  | a | %> <li> <%= link_to h(a.title), url( :article , a) %> </li> <%  end  %> </ul>
Add Part to View <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/articles/show.html.erb <% throw_content  :sidebar   do  %> <%= partial  'shared/me'  %> <%= part  RecentArticles  =>  &quot;index&quot; ,  :limit  =>  5  %> <%  end  %>
Recent Articles <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
Generate Admin Controller <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> ~/projects/blog $ merb-gen resource_controller admin/articles  create  app/controllers/admin  create  app/helpers/admin  create  app/views/admin/articles  create  app/controllers/admin/articles.rb  create  app/helpers/admin/articles_helper.rb  create  app/views/admin/articles/edit.html.erb  create  app/views/admin/articles/index.html.erb  create  app/views/admin/articles/new.html.erb  create  app/views/admin/articles/show.html.erb
Add Admin Route <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> config/router.rb Merb :: Router .prepare  do  | r | r.namespace  :admin   do  | admin | admin.resources  :articles end   r.resources  :articles end
View Routes <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> ~/projects/blog $ merb -i >> merb.show_routes Named Routes edit_admin_article: /admin/articles/:id/edit delete_admin_article: /admin/articles/:id/delete article: /articles/:id admin_articles: /admin/articles new_article: /articles/new admin_article: /admin/articles/:id edit_article: /articles/:id/edit articles: /articles new_admin_article: /admin/articles/new delete_article: /articles/:id/delete
Admin Articles View <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/admin/articles/index.html.erb <h2> Articles </h2> <p> <%= link_to  &quot;Create New Article&quot; , url( :new_admin_article ) %> <ul> <%  @articles .each  do  | a | %> <li> <%= link_to h(a.title), url( :admin_article , a) %> </li> <%  end  %> </ul>
Admin New Article View <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/admin/articles/new.html.erb <h2> New Article </h2> <%= partial  'form'  %>
Admin Edit Article View <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/admin/articles/edit.html.erb <h2> Edit Article </h2> <%= partial  'form'  %>
Admin Article Form <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/admin/articles/_form.html.erb <%= error_messages_for  :article  %> <% form_for  @article ,  :action  => url( :admin_article ,  @article )  do  %> <div class= &quot;field&quot; > <%= text_control  :title ,  :label  =>  'Title'  %> </div> <div class= &quot;field&quot; > <%= text_area_control  :body ,  :rows  =>  20 ,  :cols  =>  80  %> <div> <div class= &quot;buttons&quot; > <%= submit_button  'Save'  %> </div> <%  end  %>
Create a New Article <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
Admin Article View <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/admin/articles/show.html.erb <h2> <%=h  @article .title %> </h2> <p> <%=h  @article .body %> </p> <hr /> <%= link_to  &quot;Back to Articles&quot; , url( :admin_articles ) %> | <%= link_to  &quot;Edit this Article&quot; , url( :edit_admin_article ,  @article ) %>
So is it worth it?
Numbers <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> min  avg  max  stddev rails GET /articles  37.4  45.7  47.0  2.0  rails GET /articles/1  44.0  45.1  45.8  0.6  merb GET /articles  70.0  71.1  73.0  0.8  merb GET /articles/1  88.0  107.1  110.1  7.2 requests/second
Thank You! http://merbivore.com #merb on irc.freenode.net http://mwrc2008.conf reaks.com/02zygmuntowicz.html http://paulbarry.co m Resources

merb.intro

  • 1.
    merb.intro :by => &quot;Paul Barry&quot; &quot;Paul Barry&quot;
  • 2.
    What is Merb?A Ruby MVC Web Framework similar to Rails, but: • Small • Fast • Light • Less Opinionated
  • 3.
    Create Your App$ merb-gen app blog ~/projects
  • 4.
    Configure Your Appconfig/init.rb use_orm :activerecord dependency &quot;merb-action-args&quot; dependency &quot;merb-assets&quot; dependency &quot;merb-builder&quot; dependency &quot;merb-parts&quot; dependency &quot;merb_activerecord&quot; dependency &quot;merb_helpers&quot;
  • 5.
    Configure Your Databaseconfig/database.yml development: adapter: sqlite3 database: dev.db timeout: 5000 test: adapter: sqlite3 database: test.db timeout: 5000
  • 6.
    Generate a Model$ merb-gen model article title:string body:text ~/projects/blog
  • 7.
    Create the Table$ rake db:migrate ~/projects/blog
  • 8.
    Create an Article$ merb -i >> article = Article.new(:title => 'First Post')‏ => #<Article id: nil...> >> article.body = 'Lorem ipsum dolor sit amet...' => &quot;Lorem ipsum dolor sit amet...&quot; >> article.save!=> true ~/projects/blog
  • 9.
    Create a Controllerapp/controllers/articles.rb class Articles < Application def index &quot;Hello, World!&quot; end end
  • 10.
    Create RESTful Routeconfig/router.rb Merb :: Router .prepare do | r | r.resources :articles end
  • 11.
    Start Merb $merb ~/projects/blog
  • 12.
  • 13.
    Named Route config/router.rbr.match( &quot;/sleep/:time&quot; ).to( :controller => &quot;sleeper&quot; , :action => &quot;execute&quot; ).name( :sleeper )‏
  • 14.
    Blocking Controller app/controllers/sleeper.rbclass Sleeper < Application def execute (time = 5 )‏ sleep time.to_i &quot;I slept for #{time} seconds&quot; end end
  • 15.
    Non-Blocking Controller app/controllers/sleeper.rbclass Sleeper < Application def execute (time = 5 )‏ render_deferred do sleep time.to_i &quot;I slept for #{time} seconds&quot; end end end
  • 16.
  • 17.
    Create a RealAction app/controllers/articles.rb class Articles < Application def index @articles = Article .find( :all , :limit => 5 , :order => &quot;created_at desc&quot; )‏ display @articles end end
  • 18.
    Create the Viewapp/views/articles/index.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <% throw_content :page_title , &quot;Articles&quot; %> <% throw_content :sidebar do %> <%= partial 'shared/me' %> <% end %> <%= partial 'article' , :with => @articles %>
  • 19.
    Create the Partialapp/views/articles/_article.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <div id= &quot;article_ <%= article.id %> &quot; class= &quot;article&quot; > <h2> <%= link_to h(article.title), url( :article , article) %> </h2> <p class= &quot;posted_at&quot; > Posted at <%= article.created_at.strftime &quot;%l:%M %p&quot; %> on <%= article.created_at.strftime &quot;%A, %B %e&quot; %> <p> <%= h(article.body) %> </p> </div>
  • 20.
    Create the SharedPartial app/views/shared/_me.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <h2> About Me </h2> <%= image_tag &quot;me.jpg&quot; %>
  • 21.
    Create the Layoutapp/views/layout/articles.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <html> <head> <title> Merb Blog - <%= catch_content :page_title %> </title> <%= css_include_tag 'application' %> <%= catch_content :html_head %> </head> <body> <div id= &quot;page&quot; > <div id= &quot;header&quot; ><h1> Merb Blog </h1></div> <div id= &quot;content&quot; > <%= catch_content %> </div> <div id= &quot;sidebar&quot; > <%= catch_content :sidebar %> </div> </div> </body> </html>
  • 22.
  • 23.
    Create the ShowAction app/controllers/articles.rb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> def show (id)‏ @article = Article .find_by_id(id)‏ raise NotFound unless @article display @article end
  • 24.
    Create the ShowView app/views/show.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <% throw_content :page_title , h( @article .title) %> <% throw_content :sidebar do %> <%= partial 'shared/me' %> <% end %> <%= partial 'article' , :with => @article %>
  • 25.
    View Article <%throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  • 26.
    Add RSS MimeType config/init.rb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> Merb .add_mime_type :rss , nil , %w[text/xml]
  • 27.
    Add RSS toProvides app/controllers/articles.rb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> class Articles < Application provides :rss def index @articles = Article .find( :all , :limit => 5 , :order => &quot;created_at desc&quot; )‏ display @articles end end
  • 28.
    Create RSS Builderapp/views/articles/index.rss.builder <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> xml.instruct! :xml , :version => &quot;1.0&quot; xml.rss :version => &quot;2.0&quot; do xml.channel do xml.title &quot;Merb Blog&quot; xml.description &quot;The greatest blog in the world&quot; xml.link &quot; http://merb.blog &quot; @articles .each do | a | xml.item do xml.title a.title xml.description a.body xml.pubDate a.created_at.to_s( :rfc822 )‏ xml.link url( :article , a)‏ xml.guid url( :article , a)‏ end end end end
  • 29.
    Add Auto-Discovery Linkapp/views/articles/index.html.erb <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <% throw_content :html_head do %> <link rel= &quot;alternate&quot; type= &quot;application/rss+xml&quot; title= &quot;RSS&quot; href= &quot;/articles.rss&quot; /> <% end %>
  • 30.
    RSS Icon <%throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  • 31.
    RSS Feed <%throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  • 32.
    Create Recent ArticlePart <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> class RecentArticles < Merb::PartController def index @articles = Article .find( :all , :limit => params[ :limit ], :order => 'created_at desc' )‏ render end end app/parts/recent_articles.rb
  • 33.
    Recent Article PartView <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/parts/views/recent_articles/index.html.erb <h2> Recent Articles </h2> <ul> <% @articles .each do | a | %> <li> <%= link_to h(a.title), url( :article , a) %> </li> <% end %> </ul>
  • 34.
    Add Part toView <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/articles/show.html.erb <% throw_content :sidebar do %> <%= partial 'shared/me' %> <%= part RecentArticles => &quot;index&quot; , :limit => 5 %> <% end %>
  • 35.
    Recent Articles <%throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  • 36.
    Generate Admin Controller<% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> ~/projects/blog $ merb-gen resource_controller admin/articles create app/controllers/admin create app/helpers/admin create app/views/admin/articles create app/controllers/admin/articles.rb create app/helpers/admin/articles_helper.rb create app/views/admin/articles/edit.html.erb create app/views/admin/articles/index.html.erb create app/views/admin/articles/new.html.erb create app/views/admin/articles/show.html.erb
  • 37.
    Add Admin Route<% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> config/router.rb Merb :: Router .prepare do | r | r.namespace :admin do | admin | admin.resources :articles end r.resources :articles end
  • 38.
    View Routes <%throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> ~/projects/blog $ merb -i >> merb.show_routes Named Routes edit_admin_article: /admin/articles/:id/edit delete_admin_article: /admin/articles/:id/delete article: /articles/:id admin_articles: /admin/articles new_article: /articles/new admin_article: /admin/articles/:id edit_article: /articles/:id/edit articles: /articles new_admin_article: /admin/articles/new delete_article: /articles/:id/delete
  • 39.
    Admin Articles View<% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/admin/articles/index.html.erb <h2> Articles </h2> <p> <%= link_to &quot;Create New Article&quot; , url( :new_admin_article ) %> <ul> <% @articles .each do | a | %> <li> <%= link_to h(a.title), url( :admin_article , a) %> </li> <% end %> </ul>
  • 40.
    Admin New ArticleView <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/admin/articles/new.html.erb <h2> New Article </h2> <%= partial 'form' %>
  • 41.
    Admin Edit ArticleView <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/admin/articles/edit.html.erb <h2> Edit Article </h2> <%= partial 'form' %>
  • 42.
    Admin Article Form<% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/admin/articles/_form.html.erb <%= error_messages_for :article %> <% form_for @article , :action => url( :admin_article , @article ) do %> <div class= &quot;field&quot; > <%= text_control :title , :label => 'Title' %> </div> <div class= &quot;field&quot; > <%= text_area_control :body , :rows => 20 , :cols => 80 %> <div> <div class= &quot;buttons&quot; > <%= submit_button 'Save' %> </div> <% end %>
  • 43.
    Create a NewArticle <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  • 44.
    Admin Article View<% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> app/views/admin/articles/show.html.erb <h2> <%=h @article .title %> </h2> <p> <%=h @article .body %> </p> <hr /> <%= link_to &quot;Back to Articles&quot; , url( :admin_articles ) %> | <%= link_to &quot;Edit this Article&quot; , url( :edit_admin_article , @article ) %>
  • 45.
    So is itworth it?
  • 46.
    Numbers <% throw_content:page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> min avg max stddev rails GET /articles 37.4 45.7 47.0 2.0 rails GET /articles/1 44.0 45.1 45.8 0.6 merb GET /articles 70.0 71.1 73.0 0.8 merb GET /articles/1 88.0 107.1 110.1 7.2 requests/second
  • 47.
    Thank You! http://merbivore.com#merb on irc.freenode.net http://mwrc2008.conf reaks.com/02zygmuntowicz.html http://paulbarry.co m Resources