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 (note that the block must return an array):
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.
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
This plugin does not work with the params_capturing plugin, as it does not offer the ability to associate block arguments with named keys.