Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

merb.intro

7,487 views

Published on

An introduction the Merb Framework

Published in: Technology
  • Thanks for posting this. Its the best merb basics walkthrough i've seen yet - very helpful.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Should be app/views/articles/show.html.erb, yeah?
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

merb.intro

  1. 1. merb.intro :by => "Paul Barry" "Paul Barry"
  2. 2. What is Merb? A Ruby MVC Web Framework similar to Rails, but: • Small • Fast • Light • Less Opinionated
  3. 3. Create Your App $ merb-gen app blog ~/projects
  4. 4. 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"
  5. 5. Configure Your Database config/database.yml development: adapter: sqlite3 database: dev.db timeout: 5000 test: adapter: sqlite3 database: test.db timeout: 5000
  6. 6. Generate a Model $ merb-gen model article title:string body:text ~/projects/blog
  7. 7. Create the Table $ rake db:migrate ~/projects/blog
  8. 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. 9. Create a Controller app/controllers/articles.rb class Articles < Application def index &quot;Hello, World!&quot; end end
  10. 10. Create RESTful Route config/router.rb Merb :: Router .prepare do | r | r.resources :articles end
  11. 11. Start Merb $ merb ~/projects/blog
  12. 12. View the controller
  13. 13. Named Route config/router.rb r.match( &quot;/sleep/:time&quot; ).to( :controller => &quot;sleeper&quot; , :action => &quot;execute&quot; ).name( :sleeper )‏
  14. 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. 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. 16. Demo
  17. 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. 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. 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. 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. 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>
  22. 22. View Articles
  23. 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. 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. 25. View Article <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  26. 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. 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. 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. 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. 30. RSS Icon <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  31. 31. RSS Feed <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  32. 32. Create Recent Article Part <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %> <ul><li>class RecentArticles < Merb::PartController </li></ul><ul><li>def index </li></ul><ul><li>@articles = Article .find( :all , </li></ul><ul><li>:limit => params[ :limit ], </li></ul><ul><ul><ul><ul><li>:order => 'created_at desc' )‏ </li></ul></ul></ul></ul><ul><li>render </li></ul><ul><li>end </li></ul><ul><li>end </li></ul>app/parts/recent_articles.rb
  33. 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. 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. 35. Recent Articles <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  36. 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. 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. 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. 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. 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. 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. 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. 43. Create a New Article <% throw_content :page_title, &quot;Articles&quot; %><%= partial 'article', :with => @articles %>
  44. 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. 45. So is it worth it?
  46. 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. 47. Thank You! http://merbivore.com #merb on irc.freenode.net http://mwrc2008.conf reaks.com/02zygmuntowicz.html http://paulbarry.co m Resources

×