merb slices

86
Merb Slices

Upload: hassox

Post on 18-May-2015

5.243 views

Category:

Technology


0 download

DESCRIPTION

Presentation given at merb-camp 08 outlining merb-slices

TRANSCRIPT

Page 1: Merb Slices

Merb Slices

Page 2: Merb Slices

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

Who Am I?

• Daniel Neighman a.k.a. hassox

• Engine Yarder

• Proud Aussie

Page 4: Merb Slices

What’s a Merb Slice?

Page 5: Merb Slices

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

What’s Included?• Full MVC Components

• Assets

• Routes

• Full Namespacing

• Hot Code Loading / Unloading

• Distribution as Gems

Page 7: Merb Slices

Slice It

Page 8: Merb Slices

Slice It

• Get it:

➡ $ sudo gem install blog_slice

Page 9: Merb Slices

Slice It

• Get it:

➡ $ sudo gem install blog_slice

• Install it: ➡ $ rake slices:blog_slice:install

Page 10: Merb Slices

Configure It

Page 11: Merb Slices

Configure It

config/init.rb

dependency "merb-slices"dependency "blog_slice"

Page 12: Merb Slices

Configure It

config/init.rb

dependency "merb-slices"dependency "blog_slice"

config/routes.rb

Merb::Router.prepare do all_slicesend

Page 13: Merb Slices

Run It

Page 14: Merb Slices

Run It

$ merb

Page 15: Merb Slices

Use It

Page 16: Merb Slices

Use It

• By Default, your slice is available at:

• http://localhost:4000/blog_slice

Page 17: Merb Slices

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

Rake It

Page 19: Merb Slices

Rake ItThere are many rake tasks available

Page 20: Merb Slices

Rake ItThere are many rake tasks available

Page 21: Merb Slices

Rake ItThere are many rake tasks available

• rake slices

Page 22: Merb Slices

Rake ItThere are many rake tasks available

• rake slices

• rake slices:install_as_gem

Page 23: Merb Slices

Rake ItThere are many rake tasks available

• rake slices

• rake slices:install_as_gem

• rake -T slices:blog_slice

Page 24: Merb Slices

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

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

Custom Options

Page 27: Merb Slices

Custom Options

• Each Slice has a Configuration Hash

• Merb::Slices::config[:blog_slice]

Page 28: Merb Slices

Custom Options

• Each Slice has a Configuration Hash

• Merb::Slices::config[:blog_slice]

• Aliased To:

• BlogSlice[]

Page 29: Merb Slices

Custom Actions

Page 30: Merb Slices

Custom ActionsAdding the Action to the controller$ rake slices:blog_slice:patch

Page 31: Merb Slices

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

Custom Views

Page 33: Merb Slices

Custom Views$ rake slices:blog_slice:freeze:views

Page 34: Merb Slices

Custom Views$ rake slices:blog_slice:freeze:views

Available in:

Merb.root/slices/blog_slice/app/views

Page 35: Merb Slices

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

Custom Layout

Page 37: Merb Slices

Custom Layout

• By Default the Slice layout is used

Page 38: Merb Slices

Custom Layout

• By Default the Slice layout is used

Merb::BootLoader.after_app_loads do

BlogSlice[:layout] = :blog_slice_layoutend

Page 39: Merb Slices

Custom Models

Page 40: Merb Slices

Custom Models

Stubs or Freeze?

$ rake slices:blog_slice:freeze:models

Page 41: Merb Slices

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

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

Prefix URL Paths

Page 44: Merb Slices

Prefix URL Paths

• Setup a Path Prefix

• add_slice(:blog_slice, "awesome")

• Example: /awesome/posts

Page 45: Merb Slices

Prefix Named Routes

Page 46: Merb Slices

Prefix Named Routes

• Default name_prefix on named routes:

• add_slice(:blog_slice)

• url(:blog_slice_posts)

Page 47: Merb Slices

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

Write It

Page 49: Merb Slices

Development Flow

Page 50: Merb Slices

Development Flow

•Generate•Write•Use•Write•Use•Finish - Install

Page 51: Merb Slices

Development Flow

•Generate•Write•Use•Write•Use•Finish - Install

$ slice

Page 52: Merb Slices

Generate It

$ merb-gen slice blog_slice

Page 53: Merb Slices

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

Some Important Filesblog_slice/lib

blog_slice

merbtasks.rb

slicetasks.rb < Here be dragons

spectasks.rb

blog_slice.rb

Page 55: Merb Slices

Initialize It

Page 56: Merb Slices

Initialize It

• blog_slice.rb is where the slice initializes

Page 57: Merb Slices

Initialize It

• blog_slice.rb is where the slice initializes

• Dependencies

Page 58: Merb Slices

Initialize It

• blog_slice.rb is where the slice initializes

• Dependencies

• Router

Page 59: Merb Slices

Initialize It

• blog_slice.rb is where the slice initializes

• Dependencies

• Router

• Hooks

Page 60: Merb Slices

Fake It

• Setup a fake “host app” env in config/init.rb

• config/init.rb is not used normally

Page 61: Merb Slices

Controllers

Page 62: Merb Slices

Controllers• blog_slice/app/controllers/posts.rb

class BlogSlice::Posts < BlogSlice::Application

# Your Controller Code Here end # Posts

Page 63: Merb Slices

Views

• blog_slice/app/views/posts/show.html.haml

• blog_slice/app/views/layouts/application.html.haml

Page 64: Merb Slices

Layouts

• blog_slice/lib/blog_slice.rb Merb::Slices::config[:blog_slice][:layout] ||= :blog_slice

Page 65: Merb Slices

slice_url

Page 66: Merb Slices

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

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

Assets

Page 69: Merb Slices

Assets

• blog_slice/public

• images, css, javascipt

• Read:

blog_slice/app/helpers/application_helper.rb

Page 70: Merb Slices

Images

• blog_slice/public/images

• Helper: image_path(image)

Page 71: Merb Slices

Javascript

• blog_slice/public/javascripts

• Helper: javascript_path(javascript)

Page 72: Merb Slices

Stylesheets

• blog_slice/public/stylesheets

• Helper: stylesheet_path(style)

Page 73: Merb Slices

Install Assets

• rake slices:blog_slice:copy_assets

Page 74: Merb Slices

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

Hook It

Page 76: Merb Slices

Hook It

• loaded

Page 77: Merb Slices

Hook It

• loaded

• init

Page 78: Merb Slices

Hook It

• loaded

• init

• activate

Page 79: Merb Slices

Hook It

• loaded

• init

• activate

• deactivate

Page 80: Merb Slices

Hooks - loaded

• Slice Code Loads

• Hook - loaded

• Boot Loader LoadClasses

Page 81: Merb Slices

Hooks - init, activate

• Slice Hook - init

• BootLoader AfterAppLoads

• Slice Hook - activate: triggered by Merb::Slices.activate(BlogSlice)

Page 82: Merb Slices

Hooks - deactivate

• Triggered by Merb::Slices.deactivate(BlogSlice)

Page 83: Merb Slices

Spec It

• Specs go in blog_slice/spec

• rake -T spec

• Spec your slice like an app

Page 84: Merb Slices

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

Distribute It

• rake gemspec

• rake install

Page 86: Merb Slices

Questions?