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.

Example:

plugin :path
path :foo, '/foo'
path :bar do |bar|
  "/bar/#{bar.id}"
end
path Baz do |baz, *paths|
  "/baz/#{baz.id}/#{paths.join('/')}"
end
path Quux do |quux, path|
  "/quux/#{quux.id}/#{path}"
end

route do |r|
  r.post 'foo' do
    r.redirect foo_path # /foo
  end

  r.post '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
  end

  r.post 'baz' do
    bar = Baz[1]
    r.redirect path(baz, 'c', 'd') # /baz/1/c/d
  end

  r.post 'quux' do
    bar = Quux[1]
    r.redirect path(quux, '/bar') # /quux/1/bar
  end
end

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

:add_script_name

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

:name

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

:url

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.

:url_only

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

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

Methods

Public Class

  1. configure

Constants

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

Public Class methods

configure (app, opts=OPTS)

Initialize the path classes when loading the plugin. Options:

:by_name

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

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