SlideShare a Scribd company logo
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

More Related Content

PPT
Spring 2.0
PPT
Getting More Traffic From Search Advanced Seo For Developers Presentation
PPT
Spring 2.0
PPT
Advanced SEO for Web Developers
ODP
Cucumber: How I Slice It
PDF
Story Driven Web Development
ODP
Beautiful Java EE - PrettyFaces
PPTX
The New Renaissance of JavaScript
Spring 2.0
Getting More Traffic From Search Advanced Seo For Developers Presentation
Spring 2.0
Advanced SEO for Web Developers
Cucumber: How I Slice It
Story Driven Web Development
Beautiful Java EE - PrettyFaces
The New Renaissance of JavaScript

What's hot (19)

ODP
My Story With Flickr
PPTX
Query Classification on Steroids with BERT
PPT
Fast Loading JavaScript
PPT
Web APIs & Google APIs
PDF
Rendering SEO Manifesto - Why we need to go beyond JavaScript SEO
PDF
Debugging rendering problems at scale
ODP
PrettyFaces: SEO, Dynamic, Parameters, Bookmarks, Navigation for JSF / JSF2 (...
PPTX
Solving Complex JavaScript Issues and Leveraging Semantic HTML5
PDF
Recipe book flipped-coding
PPT
Mashups & APIs
PPTX
GTM Clowns, fun and hacks - Search Elite - May 2017 Gerry White
PDF
Make your PWA feel more like an app
PPT
Getting the Most Out of OpenSocial Gadgets
PDF
seo savage 2012
PPTX
Schema.org and the changing world of Rich Results - SEOEdinburgh Meetup
PDF
Double Loop: TDD & BDD Done Right!
PDF
Migrating a large scale banking app to compose
PPTX
Make Your Own Damn SEO Tools (Using Google Docs!)
PPT
Google Wave 20/20: Product, Protocol, Platform
My Story With Flickr
Query Classification on Steroids with BERT
Fast Loading JavaScript
Web APIs & Google APIs
Rendering SEO Manifesto - Why we need to go beyond JavaScript SEO
Debugging rendering problems at scale
PrettyFaces: SEO, Dynamic, Parameters, Bookmarks, Navigation for JSF / JSF2 (...
Solving Complex JavaScript Issues and Leveraging Semantic HTML5
Recipe book flipped-coding
Mashups & APIs
GTM Clowns, fun and hacks - Search Elite - May 2017 Gerry White
Make your PWA feel more like an app
Getting the Most Out of OpenSocial Gadgets
seo savage 2012
Schema.org and the changing world of Rich Results - SEOEdinburgh Meetup
Double Loop: TDD & BDD Done Right!
Migrating a large scale banking app to compose
Make Your Own Damn SEO Tools (Using Google Docs!)
Google Wave 20/20: Product, Protocol, Platform
Ad

Viewers also liked (19)

PPT
Grant Concept Brij Slides
PPS
Publicity Art
PPT
Weblogs Wikis E Portfolios
PPS
Sub Prime Crisis Explained
PPT
Weblogs - Wikis - ePortfolios
PPS
Creation Story Rewritten
PPT
Google App Engine
PPS
Para Mis Friendss
PPT
States Of Matter[1]
PPTX
The Application Development Lifecycle
PPS
Cosas
PPT
Brij Singhs Ideas
PDF
I sette peccati capitali dell'albergatore (in tema di reputation) #tourismreload
PPTX
The Yubikey
PDF
Travel Appeal Destination
PPSX
Introducción tecnología educativa
PDF
viamedia portfolio presentation pdf
PPT
States Of Matter Power Point
PPTX
Retooling you CMS- Charting a Successful Course
Grant Concept Brij Slides
Publicity Art
Weblogs Wikis E Portfolios
Sub Prime Crisis Explained
Weblogs - Wikis - ePortfolios
Creation Story Rewritten
Google App Engine
Para Mis Friendss
States Of Matter[1]
The Application Development Lifecycle
Cosas
Brij Singhs Ideas
I sette peccati capitali dell'albergatore (in tema di reputation) #tourismreload
The Yubikey
Travel Appeal Destination
Introducción tecnología educativa
viamedia portfolio presentation pdf
States Of Matter Power Point
Retooling you CMS- Charting a Successful Course
Ad

Similar to merb.intro (20)

PPT
What's new in Rails 2?
ODP
Haml & Sass presentation
PPTX
Master pages ppt
PDF
Building Web Interface On Rails
PPT
Boston Computing Review - Ruby on Rails
PPT
JSP Custom Tags
PPT
EPiServer Web Parts
PPT
KMUTNB - Internet Programming 3/7
PDF
User Experience is dead. Long live the user experience!
PPT
HTML5 Overview
ODP
Developing and testing ajax components
PPT
Rich faces
PDF
OSDC 2009 Rails Turtorial
PPT
Meta tags1
PPT
Lecture 1 - Comm Lab: Web @ ITP
PPT
Ajax
PPT
Lecture 6 - Comm Lab: Web @ ITP
PPTX
APEX Themes and Templates
PPT
Evolution of API With Blogging
What's new in Rails 2?
Haml & Sass presentation
Master pages ppt
Building Web Interface On Rails
Boston Computing Review - Ruby on Rails
JSP Custom Tags
EPiServer Web Parts
KMUTNB - Internet Programming 3/7
User Experience is dead. Long live the user experience!
HTML5 Overview
Developing and testing ajax components
Rich faces
OSDC 2009 Rails Turtorial
Meta tags1
Lecture 1 - Comm Lab: Web @ ITP
Ajax
Lecture 6 - Comm Lab: Web @ ITP
APEX Themes and Templates
Evolution of API With Blogging

Recently uploaded (20)

PDF
Encapsulation theory and applications.pdf
PDF
Zenith AI: Advanced Artificial Intelligence
PDF
Transform Your ITIL® 4 & ITSM Strategy with AI in 2025.pdf
PPTX
TLE Review Electricity (Electricity).pptx
PDF
1 - Historical Antecedents, Social Consideration.pdf
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
Hindi spoken digit analysis for native and non-native speakers
PDF
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Heart disease approach using modified random forest and particle swarm optimi...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
Tartificialntelligence_presentation.pptx
PDF
Enhancing emotion recognition model for a student engagement use case through...
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
Mushroom cultivation and it's methods.pdf
PDF
project resource management chapter-09.pdf
Encapsulation theory and applications.pdf
Zenith AI: Advanced Artificial Intelligence
Transform Your ITIL® 4 & ITSM Strategy with AI in 2025.pdf
TLE Review Electricity (Electricity).pptx
1 - Historical Antecedents, Social Consideration.pdf
SOPHOS-XG Firewall Administrator PPT.pptx
Hindi spoken digit analysis for native and non-native speakers
From MVP to Full-Scale Product A Startup’s Software Journey.pdf
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Heart disease approach using modified random forest and particle swarm optimi...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Tartificialntelligence_presentation.pptx
Enhancing emotion recognition model for a student engagement use case through...
MIND Revenue Release Quarter 2 2025 Press Release
Accuracy of neural networks in brain wave diagnosis of schizophrenia
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Group 1 Presentation -Planning and Decision Making .pptx
Mushroom cultivation and it's methods.pdf
project resource management chapter-09.pdf

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 App config/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 Database config/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 Controller app/controllers/articles.rb class Articles < Application def index &quot;Hello, World!&quot; end end
  • 10. Create RESTful Route config/router.rb Merb :: Router .prepare do | r | r.resources :articles end
  • 11. Start Merb $ merb ~/projects/blog
  • 13. Named Route config/router.rb r.match( &quot;/sleep/:time&quot; ).to( :controller => &quot;sleeper&quot; , :action => &quot;execute&quot; ).name( :sleeper )‏
  • 14. 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
  • 15. 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
  • 16. Demo
  • 17. 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
  • 18. 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 %>
  • 19. 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>
  • 20. 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; %>
  • 21. 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>
  • 23. 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
  • 24. 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 %>
  • 25. View Article <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  • 26. 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]
  • 27. 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
  • 28. 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
  • 29. 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 %>
  • 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 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
  • 33. 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>
  • 34. 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 %>
  • 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 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' %>
  • 41. 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' %>
  • 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 New Article <% 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 it worth 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