Merb Slices
-
Upload
hassox -
Category
Technology
-
view
5.235 -
download
0
description
Transcript of Merb Slices
![Page 1: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/1.jpg)
Merb Slices
![Page 2: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/2.jpg)
Slice By Who?
• Fabien Franzen a.k.a. loob2
• Actually remembers Merb 0.0.0.1 a.k.a ‘the pastie’
• Representing Belgium (or maybe not...)
![Page 3: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/3.jpg)
Who Am I?
• Daniel Neighman a.k.a. hassox
• Engine Yarder
• Proud Aussie
![Page 4: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/4.jpg)
What’s a Merb Slice?
![Page 5: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/5.jpg)
What’s a Merb Slice?
• Full Stack Mini Merb Application
• Designed to be shared between applications
• Built on Merbs Public API
![Page 6: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/6.jpg)
What’s Included?• Full MVC Components
• Assets
• Routes
• Full Namespacing
• Hot Code Loading / Unloading
• Distribution as Gems
![Page 7: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/7.jpg)
Slice It
![Page 8: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/8.jpg)
Slice It
• Get it:
➡ $ sudo gem install blog_slice
![Page 9: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/9.jpg)
Slice It
• Get it:
➡ $ sudo gem install blog_slice
• Install it: ➡ $ rake slices:blog_slice:install
![Page 10: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/10.jpg)
Configure It
![Page 11: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/11.jpg)
Configure It
config/init.rb
dependency "merb-slices"dependency "blog_slice"
![Page 12: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/12.jpg)
Configure It
config/init.rb
dependency "merb-slices"dependency "blog_slice"
config/routes.rb
Merb::Router.prepare do all_slicesend
![Page 13: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/13.jpg)
Run It
![Page 14: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/14.jpg)
Run It
$ merb
![Page 15: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/15.jpg)
Use It
![Page 16: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/16.jpg)
Use It
• By Default, your slice is available at:
• http://localhost:4000/blog_slice
![Page 17: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/17.jpg)
Use It
• By Default, your slice is available at:
• http://localhost:4000/blog_slice
• Get the posts:
• http://localhost:4000/blog_slice/posts
![Page 18: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/18.jpg)
Rake It
![Page 19: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/19.jpg)
Rake ItThere are many rake tasks available
![Page 20: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/20.jpg)
Rake ItThere are many rake tasks available
![Page 21: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/21.jpg)
Rake ItThere are many rake tasks available
• rake slices
![Page 22: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/22.jpg)
Rake ItThere are many rake tasks available
• rake slices
• rake slices:install_as_gem
![Page 23: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/23.jpg)
Rake ItThere are many rake tasks available
• rake slices
• rake slices:install_as_gem
• rake -T slices:blog_slice
![Page 24: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/24.jpg)
Common Rake Tasks
• rake slices:blog_slice:copy_assets
• rake slices:blog_slice:patch
• rake slices:blog_slice:freeze(:*)
• rake slices:blog_slice:migrate
• rake slices:blog_slice:spec
![Page 25: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/25.jpg)
Customize It
• It’s just ruby. Monkey Patch it
• Use the “patch” rake task
• Slice code is in your app:
• Merb.root/slices/blog_slice
![Page 26: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/26.jpg)
Custom Options
![Page 27: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/27.jpg)
Custom Options
• Each Slice has a Configuration Hash
• Merb::Slices::config[:blog_slice]
![Page 28: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/28.jpg)
Custom Options
• Each Slice has a Configuration Hash
• Merb::Slices::config[:blog_slice]
• Aliased To:
• BlogSlice[]
![Page 29: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/29.jpg)
Custom Actions
![Page 30: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/30.jpg)
Custom ActionsAdding the Action to the controller$ rake slices:blog_slice:patch
![Page 31: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/31.jpg)
Custom ActionsAdding the Action to the controller$ rake slices:blog_slice:patch
Edit: Merb.root/blog_slices/app/controllers/posts.rb
def publish @post = Post.first(:permalink => params[:permalink]) if @post.publish! redirect slice_url(:post, @post), :message => "Posts Published" else render :edit end end
![Page 32: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/32.jpg)
Custom Views
![Page 33: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/33.jpg)
Custom Views$ rake slices:blog_slice:freeze:views
![Page 34: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/34.jpg)
Custom Views$ rake slices:blog_slice:freeze:views
Available in:
Merb.root/slices/blog_slice/app/views
![Page 35: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/35.jpg)
Custom Views$ rake slices:blog_slice:freeze:views
Available in:
Merb.root/slices/blog_slice/app/views
Add templates for additional formats
![Page 36: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/36.jpg)
Custom Layout
![Page 37: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/37.jpg)
Custom Layout
• By Default the Slice layout is used
![Page 38: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/38.jpg)
Custom Layout
• By Default the Slice layout is used
Merb::BootLoader.after_app_loads do
BlogSlice[:layout] = :blog_slice_layoutend
![Page 39: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/39.jpg)
Custom Models
![Page 40: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/40.jpg)
Custom Models
Stubs or Freeze?
$ rake slices:blog_slice:freeze:models
![Page 41: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/41.jpg)
Custom Models
Stubs or Freeze?
$ rake slices:blog_slice:freeze:models
module BlogSlice class Post property :published, Boolean property :published_at, DateTime def publish! self.published = true self.published_at = DateTime.now save end end # Postend # BlogSlice
![Page 42: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/42.jpg)
Custom Routes
Merb::Router.prepare do add_slice(:blog_slice, :path_prefix => "blog", :default_routes => nil) do identify BlogSlice::Post => :permalink do match("/posts/:permalink/publish"). to(:controller => "posts", :action => "publish"). name(:publish) end end end
![Page 43: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/43.jpg)
Prefix URL Paths
![Page 44: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/44.jpg)
Prefix URL Paths
• Setup a Path Prefix
• add_slice(:blog_slice, "awesome")
• Example: /awesome/posts
![Page 45: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/45.jpg)
Prefix Named Routes
![Page 46: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/46.jpg)
Prefix Named Routes
• Default name_prefix on named routes:
• add_slice(:blog_slice)
• url(:blog_slice_posts)
![Page 47: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/47.jpg)
Prefix Named Routes
• Default name_prefix on named routes:
• add_slice(:blog_slice)
• url(:blog_slice_posts)
• Setup a Name Prefix
• add_slice(:blog_slice, :name_prefix => "blog")
• url(:blog_posts)
![Page 48: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/48.jpg)
Write It
![Page 49: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/49.jpg)
Development Flow
![Page 50: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/50.jpg)
Development Flow
•Generate•Write•Use•Write•Use•Finish - Install
![Page 51: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/51.jpg)
Development Flow
•Generate•Write•Use•Write•Use•Finish - Install
$ slice
![Page 52: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/52.jpg)
Generate It
$ merb-gen slice blog_slice
![Page 53: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/53.jpg)
New Slice Structureblog_slice |-app |---controllers |---helpers |---models |---views |-----layout |-----main |-lib |---blog_slice |-pkg
blog_slice |-public |---images |---javascripts |---stylesheets |-spec |---controllers |-stubs |---app |-----controllers |-----models
![Page 54: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/54.jpg)
Some Important Filesblog_slice/lib
blog_slice
merbtasks.rb
slicetasks.rb < Here be dragons
spectasks.rb
blog_slice.rb
![Page 55: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/55.jpg)
Initialize It
![Page 56: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/56.jpg)
Initialize It
• blog_slice.rb is where the slice initializes
![Page 57: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/57.jpg)
Initialize It
• blog_slice.rb is where the slice initializes
• Dependencies
![Page 58: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/58.jpg)
Initialize It
• blog_slice.rb is where the slice initializes
• Dependencies
• Router
![Page 59: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/59.jpg)
Initialize It
• blog_slice.rb is where the slice initializes
• Dependencies
• Router
• Hooks
![Page 60: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/60.jpg)
Fake It
• Setup a fake “host app” env in config/init.rb
• config/init.rb is not used normally
![Page 61: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/61.jpg)
Controllers
![Page 62: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/62.jpg)
Controllers• blog_slice/app/controllers/posts.rb
class BlogSlice::Posts < BlogSlice::Application
# Your Controller Code Here end # Posts
![Page 63: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/63.jpg)
Views
• blog_slice/app/views/posts/show.html.haml
• blog_slice/app/views/layouts/application.html.haml
![Page 64: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/64.jpg)
Layouts
• blog_slice/lib/blog_slice.rb Merb::Slices::config[:blog_slice][:layout] ||= :blog_slice
![Page 65: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/65.jpg)
slice_url
![Page 66: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/66.jpg)
slice_url
• Use slice_url for url generation inside a slice
• slice_url(:controller => ..., :action => ...)
• slice_url(:post, @post)
• slice_url(:merb_auth_slice_password, :login)
![Page 67: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/67.jpg)
ModelsNamespace your models (you don’t have to)
class BlogSlice::Post include DataMapper::Resource property :id, Serial property :title, String, :lenth => 255 property :body, Text property :slug, Slug before :save do self.slug = self.title unless self.permalink end end # BlogSlice::Post
![Page 68: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/68.jpg)
Assets
![Page 69: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/69.jpg)
Assets
• blog_slice/public
• images, css, javascipt
• Read:
blog_slice/app/helpers/application_helper.rb
![Page 70: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/70.jpg)
Images
• blog_slice/public/images
• Helper: image_path(image)
![Page 71: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/71.jpg)
Javascript
• blog_slice/public/javascripts
• Helper: javascript_path(javascript)
![Page 72: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/72.jpg)
Stylesheets
• blog_slice/public/stylesheets
• Helper: stylesheet_path(style)
![Page 73: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/73.jpg)
Install Assets
• rake slices:blog_slice:copy_assets
![Page 74: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/74.jpg)
Route Itblog_slice/lib/blog_slice.rb (the init.rb)
def self.setup_router(scope) scope.identify Post => :slug do resource :posts end end
![Page 75: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/75.jpg)
Hook It
![Page 76: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/76.jpg)
Hook It
• loaded
![Page 77: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/77.jpg)
Hook It
• loaded
• init
![Page 78: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/78.jpg)
Hook It
• loaded
• init
• activate
![Page 79: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/79.jpg)
Hook It
• loaded
• init
• activate
• deactivate
![Page 80: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/80.jpg)
Hooks - loaded
• Slice Code Loads
• Hook - loaded
• Boot Loader LoadClasses
![Page 81: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/81.jpg)
Hooks - init, activate
• Slice Hook - init
• BootLoader AfterAppLoads
• Slice Hook - activate: triggered by Merb::Slices.activate(BlogSlice)
![Page 82: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/82.jpg)
Hooks - deactivate
• Triggered by Merb::Slices.deactivate(BlogSlice)
![Page 83: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/83.jpg)
Spec It
• Specs go in blog_slice/spec
• rake -T spec
• Spec your slice like an app
![Page 84: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/84.jpg)
Spec It - Setup
• Setup the routes: before :all do Merb::Router.prepare do add_slice(:blog_slice) end if standalone? end
![Page 85: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/85.jpg)
Distribute It
• rake gemspec
• rake install
![Page 86: Merb Slices](https://reader034.fdocuments.in/reader034/viewer/2022052315/5559300cd8b42a4f3d8b48cf/html5/thumbnails/86.jpg)
Questions?