Module: Roda::RodaPlugins::CustomMatchers

Defined in:
lib/roda/plugins/custom_matchers.rb

Overview

The custom_matchers plugin supports using arbitrary objects as matchers, as long as the application has been configured to accept such objects.

After loading the plugin, support for custom matchers can be configured using the custom_matcher class method. This method is generally passed the class of the object you want to use as a custom matcher, as well as a block. The block will be called in the context of the request instance with the specific matcher used in the match method.

Blocks can append to the captures in order to yield the appropriate values to match blocks, or call request methods that append to the captures.

Example:

plugin :custom_matchers
method_segment = Struct.new(:request_method, :next_segment)
custom_matcher(method_segment) do |matcher|
  # self is the request instance ("r" yielded in the route block below)
  if matcher.request_method == self.request_method
    match(matcher.next_segment)
  end
end

get_foo = method_segment.new('GET', 'foo') 
post_any = method_segment.new('POST', String) 
route do |r|
  r.on('baz') do
    r.on(get_foo) do
      # GET method, /baz/foo prefix
    end

    r.is(post_any) do |seg|
      # for POST /baz/bar, seg is "bar"
    end
  end

  r.on('quux') do
    r.is(get_foo) do
      # GET method, /quux/foo route
    end

    r.on(post_any) do |seg|
      # for POST /quux/xyz, seg is "xyz"
    end
  end
end

Defined Under Namespace

Modules: ClassMethods, RequestMethods

Class Method Summary collapse

Class Method Details

.configure(app) ⇒ Object



56
57
58
# File 'lib/roda/plugins/custom_matchers.rb', line 56

def self.configure(app)
  app.opts[:custom_matchers] ||= OPTS
end