The class_matchers plugin allows you do define custom regexps and conversion procs to use for specific classes. For example, if you have multiple routes similar to:
r.on /(\d\d\d\d)-(\d\d)-(\d\d)/ do |y, m, d| date = Date.new(y.to_i, m.to_i, d.to_i) # ... end
You can register a Date class matcher for that regexp:
class_matcher(Date, /(\d\d\d\d)-(\d\d)-(\d\d)/) do |y, m, d| Date.new(y.to_i, m.to_i, d.to_i) end
And then use the Date class as a matcher, and it will yield a Date object:
r.on Date do |date| # ... end
This is useful to DRY up code if you are using the same type of pattern and type conversion in multiple places in your application. You can have the block return an array to yield multiple captures.
If you have a segment match the passed regexp, but decide during block processing that you do not want to treat it as a match, you can have the block return nil or false. This is useful if you want to make sure you are using valid data:
class_matcher(Date, /(\d\d\d\d)-(\d\d)-(\d\d)/) do |y, m, d| y = y.to_i m = m.to_i d = d.to_i Date.new(y, m, d) if Date.valid_date?(y, m, d) end
The second argument to class_matcher can be a class already registered as a class matcher. This can DRY up code that wants a conversion performed by an existing class matcher:
class_matcher Employee, Integer do |id| Employee[id] end
With the above example, the Integer matcher performs the conversion to integer, so id
is yielded as an integer. The block then looks up the employee with that id. If there is no employee with that id, then the Employee matcher will not match.
If using the symbol_matchers plugin, you can provide a recognized symbol matcher as the second argument to class_matcher, and it will work in a similar manner:
symbol_matcher(:employee_id, /E-(\d{6})/) do |employee_id| employee_id.to_i end class_matcher Employee, :employee_id do |id| Employee[id] end
Blocks passed to the class_matchers plugin are evaluated in route block context.
This plugin does not work with the params_capturing plugin, as it does not offer the ability to associate block arguments with named keys.
Classes and Modules
Public Class methods
# File lib/roda/plugins/class_matchers.rb 77 def self.configure(app) 78 app.opts[:class_matchers] ||= { 79 Integer=>[/(\d{1,100})/, /\A\/(\d{1,100})(?=\/|\z)/, :_convert_class_Integer].freeze, 80 String=>[/([^\/]+)/, nil, nil].freeze 81 } 82 end
# File lib/roda/plugins/class_matchers.rb 73 def self.load_dependencies(app) 74 app.plugin :_symbol_class_matchers 75 end