Module: Roda::RodaPlugins::PathRewriter

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

Overview

The path_rewriter plugin allows you to rewrite the remaining path or the path info for requests. This is useful if you want to transparently treat some paths the same as other paths.

By default, rewrite_path will rewrite just the remaining path. So only routing in the current Roda app will be affected. This is useful if you have other code in your app that uses PATH_INFO and needs to see the original PATH_INFO (for example, when using relative links).

rewrite_path '/a', '/b'
# PATH_INFO '/a' => remaining_path '/b'
# PATH_INFO '/a/c' => remaining_path '/b/c'

In some cases, you may want to override PATH_INFO for the rewritten paths, such as when you are passing the request to another Rack app. For those cases, you can use the :path_info => true option to rewrite_path.

rewrite_path '/a', '/b', :path_info => true
# PATH_INFO '/a' => PATH_INFO '/b'
# PATH_INFO '/a/c' => PATH_INFO '/b/c'

If you pass a string to rewrite_path, it will rewrite all paths starting with that string. You can provide a regexp if you want more complete control, such as only matching exact paths.

rewrite_path /\A\/a\z/, '/b'
# PATH_INFO '/a' => remaining_path '/b'
# PATH_INFO '/a/c' => remaining_path '/a/c', no change

Patterns can be rewritten dynamically by providing a block accepting a MatchData object and evaluating to the replacement.

rewrite_path(/\A\/a/(\w+)/){|match| match[1].capitalize}
# PATH_INFO '/a/moo' => remaining_path '/a/Moo'
rewrite_path(/\A\/a/(\w+)/, :path_info => true){|match| match[1].capitalize}
# PATH_INFO '/a/moo' => PATH_INFO '/a/Moo'

All path rewrites are applied in order, so if a path is rewritten by one rewrite, it can be rewritten again by a later rewrite. Note that PATH_INFO rewrites are processed before remaining_path rewrites.

Defined Under Namespace

Modules: ClassMethods, RequestMethods

Constant Summary collapse

PATH_INFO =
'PATH_INFO'.freeze
OPTS =
{}.freeze

Class Method Summary collapse

Class Method Details

.configure(app) ⇒ Object



51
52
53
54
55
56
# File 'lib/roda/plugins/path_rewriter.rb', line 51

def self.configure(app)
  app.instance_exec do
    app.opts[:remaining_path_rewrites] ||= []
    app.opts[:path_info_rewrites] ||= []
  end
end