1. Welcome
  2. Getting Started [+/-]
    1. Installing from RubyGems
    2. Installing from GitHub.com
    3. Installing with Sake
  3. The Basics [+/-]
    1. Hello World
      1. Application Generation Options
    2. Paths
    3. Environments
    4. Rake
  4. Configuration [+/-]
    1. Configatron
    2. Initializers
      1. Gems
      2. Mime-Types
  5. Routing [+/-]
    1. Default Routes
    2. Named Routes
    3. RESTful/Resource Routes
    4. Nested Resource Routes
    5. Regex Routes
    6. Wildcard Routes
    7. Blocks in Routes
    8. Redirecting
    9. Error Handling
    10. Deferred? Routes
    11. Misc. Routing
  6. Controllers [+/-]
    1. Actions
    2. Headers/Status
    3. Handling Content Types
    4. Filters
    5. Helpers
    6. Layouts
    7. Tell Messaging
    8. Redirecting
    9. Rendering
      1. Engines
        1. Erubis
        2. XML Builder
        3. Extending
          1. Case Study: PDF Writer
      2. Types
        1. :action
        2. :text
        3. :inline
        4. :xml
        5. :url
        6. :partial
        7. :template
        8. :public
        9. Extending
          1. Case Study: PDF Writer
  7. Views [+/-]
    1. Helpers
    2. Layouts
    3. Assets Host
    4. Assets Management
    5. Form Builders
  8. Sessions [+/-]
    1. Session Store API
  9. Request/Response [+/-]
    1. Cookies
  10. Testing [+/-]
    1. RSpec
    2. Test::Unit::TestCase
  11. Porlets [+/-]
    1. Developing
    2. Testing
    3. Packaging
    4. Using
  12. Plugins [+/-]
    1. Extending
      1. Case Study: PDF Writer
  13. Deploying [+/-]
    1. Thin
    2. Passenger (mod_rails)
    3. Joyent Accelerator
  14. Mack More [+/-]
    1. mack-active_record
    2. mack-asset_packager
    3. mack-caching
    4. mack-data_factory
    5. mack-data_mapper
    6. mack-distributed
    7. mack-encryption
    8. mack-facets
    9. mack-haml
    10. mack-javascript
    11. mack-localization
    12. mack-markaby
    13. mack-notifier
    14. mack-orm
    15. mack-pdf_writer
  15. Rails to Mack Cheat Sheet
  16. Contributing
  17. APIs [+/-]

Blocks in Routes

It's easy to register a block with a route. The block gets called before the controller and action gets invoked for that route. The block will be passed the following parameters: request, response, and cookies.

Mack::Routes.build do |r|
  r.connect '/i/am/a/runner/block/that/doesnt/finish', :controller => :users, :action => :fun do |request, response, cookies|
    request.params[:fun] = 'Hell Yeah!'
  end
  r.connect '/i/am/a/runner/block/that/finishes' do |request, response, cookies|
    response.write('Hello')
    throw :finished
  end
end

In the first route we defined we set a parameter on the request, :fun, equal to 'Hell Yeah!'. This code block gets evaluated and the then Users#fun gets called.

In the second route we're writing 'Hello' out to the response, and then we throw :finished. When you call that throw :finished line, you're telling Mack not to bother continuing on the request stack and return the response as is. So in this case the client would receive 'Hello' as it's response.

The above routes could also be written like so:

Mack::Routes.build do |r|
  r.connect '/i/am/a/runner/block/that/doesnt/finish', :controller => :tst_another, :action => :fun_runner_block, :runner_block => Proc.new({|request, response, cookies| request.params[:fun] = 'Hell Yeah!'})
  r.connect '/i/am/a/runner/block/that/finishes', :runner_block => Proc.new({|request, response, cookies| response.write('Hello'); throw :finished})
end
This guide was written for Mack version 0.8.2