Module: Roda::RodaPlugins::Path

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

Overview

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.

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
path 'FooBar', class_name: true do |foobar|
  "/foobar/#{foobar.id}"
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
    baz = Baz[1]
    r.redirect path(baz, 'c', 'd') # /baz/1/c/d
  end

  r.post 'quux' do
    quux = Quux[1]
    r.redirect url(quux, '/bar') # http://example.com/quux/1/bar
  end
end

The path class 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.

:relative

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

: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, :relative, :url, or :url_only is used, the path method will also create a _*_path private method.

If the path class method is passed a string or symbol as the first argument, and the second argument is a hash with the :class_name option passed, the symbol/string is treated as a class name. This enables the use of class-based paths without forcing autoloads for the related classes. If the plugin is not registering classes by name, this will use the symbol or string to find the related class.

Defined Under Namespace

Modules: ClassMethods, InstanceMethods

Constant Summary collapse

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

Regexp for valid constant names, to prevent code execution.

/\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/.freeze

Class Method Summary collapse

Class Method Details

.configure(app, opts = OPTS) ⇒ Object

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)



86
87
88
89
90
91
92
93
94
95
# File 'lib/roda/plugins/path.rb', line 86

def self.configure(app, opts=OPTS)
  app.instance_eval do
    self.opts[:path_class_by_name] = opts.fetch(:by_name, ENV['RACK_ENV'] == 'development')
    self.opts[:path_classes] ||= {}
    self.opts[:path_class_methods] ||= {}
    unless path_block(String)
      path(String){|str| str}
    end
  end
end