module Roda::RodaPlugins::Path

  1. lib/roda/plugins/path.rb

The path plugin adds support for named paths. Using the path class method, you can easily create *_path instance methods for each named path. Those instance methods can then be called if you need to get the path for a form action, link, redirect, or anything else.

Additionally, you can call the path class method with a class and a block, and it will register the class. You can then call the path instance method with an instance of that class, and it will execute the block in the context of the route block scope with the arguments provided to path. You can call the url instance method with the same arguments as the path method to get the full URL.


plugin :path
path :foo, '/foo'
path :bar do |bar|
path Baz do |baz, *paths|
path Quux do |quux, path|

route do |r| 'foo' do
    r.redirect foo_path # /foo
  end 'bar' do
    bar_params = r.params['bar']
    if bar_params.is_a?(Hash)
      bar = Bar.create(bar_params)
      r.redirect bar_path(bar) # /bar/1
  end 'baz' do
    bar = Baz[1]
    r.redirect path(baz, 'c', 'd') # /baz/1/c/d
  end 'quux' do
    bar = Quux[1]
    r.redirect url(quux, '/bar') #

The path class method accepts the following options when not called with a class:


Prefix the path generated with SCRIPT_NAME. This defaults to the app's :add_script_name option.


Provide a different name for the method, instead of using *_path.


Generate paths relative to the current request instead of absolute paths by prepending an appropriate prefix. This implies :add_script_name.


Create a url method in addition to the path method, which will prefix the string generated with the appropriate scheme, host, and port. If true, creates a *_url method. If a Symbol or String, uses the value as the url method name.


Do not create a path method, just a url method.

Note that if :add_script_name, :relative, :url, or :url_only is used, the path method will also create a _*_path private method.


Public Class

  1. configure


DEFAULT_PORTS = {'http' => 80, 'https' => 443}.freeze  

Public Class methods

configure(app, opts=OPTS)

Initialize the path classes when loading the plugin. Options:


Register classes by name, which is friendlier when reloading code (defaults to true in development mode)

[show source]
   # File lib/roda/plugins/path.rb
74 def self.configure(app, opts=OPTS)
75   app.instance_eval do
76     self.opts[:path_class_by_name] = opts.fetch(:by_name, ENV['RACK_ENV'] == 'development')
77     self.opts[:path_classes] ||= {}
78     self.opts[:path_class_methods] ||= {}
79     unless path_block(String)
80       path(String){|str| str}
81     end
82   end
83 end