rake js:routes

Gem Build Status Code Climate Test Coverage license

Generate a ES6 module that contains Rails routes.

Description

This gem provides "js:routes" rake task. It generates a ES6 requirable module which exports url helper functions defined in your Rails application.

Suppose the app has following routes:

# == Route Map
#
#       Prefix Verb   URI Pattern                  Controller#Action
#     articles GET    /articles(.:format)          articles#index
#              POST   /articles(.:format)          articles#create
#  new_article GET    /articles/new(.:format)      articles#new
# edit_article GET    /articles/:id/edit(.:format) articles#edit
#      article GET    /articles/:id(.:format)      articles#show
#              PATCH  /articles/:id(.:format)      articles#update
#              PUT    /articles/:id(.:format)      articles#update
#              DELETE /articles/:id(.:format)      articles#destroy
Rails.application.routes.draw do
  resources :articles
end

then rake js:routes generates "app/assets/javascripts/rails-routes.js" as:

// Don't edit manually. `rake js:routes` generates this file.
function process(route, params, keys) {
  var query = [];
  for (var param in params) if (params.hasOwnProperty(param)) {
    if (keys.indexOf(param) === -1) {
      query.push(param + "=" + encodeURIComponent(params[param]));
    }
  }
  return query.length ? route + "?" + query.join("&") : route;
}

export function article_path(params) { return process('/articles/' + params.id + '', params, ['id']); }
export function articles_path(params) { return process('/articles', params, []); }
export function edit_article_path(params) { return process('/articles/' + params.id + '/edit', params, ['id']); }
export function new_article_path(params) { return process('/articles/new', params, []); }

VS.

railsware/js-routes spreads url helpers via global variable.

This gem uses ES6 modules.

Requirement

  • Rails >= 3.2

Usage

Generate routes file.

rake js:routes

Configuration

JSRailsRoutes supports several parameters:

Name Type Description Default
include_paths Regexp Paths match to the regexp are included /.*/
exclude_paths Regexp Paths match to the regexp are excluded /^$/
include_names Regexp Names match to the regexp are included /.*/
exclude_names Regexp Names match to the regexp are excluded /^$/
exclude_engines Regexp Rails engines match to the regexp are excluded /^$/
output_dir String Output JS file into the specified directory Rails.root.join("app", "assets", "javascripts")
camelize Symbol Output JS file with chosen camelcase type it also avaliable for :lower and :upper nil
target String Target type. "js" or "ts" "js"
route_filter Proc Fully customizable filter on JSRails::Route ->(route) { true }
route_set_filter Proc Fully customizable filter on JSRails::RouteSet ->(route_set) { true }

You can configure via JSRailsRoutes.configure.

# Rakefile
JSRailsRoutes.configure do |c|
  c.exclude_paths = %r{^/(rails|sidekiq)}
  c.output_dir = Rails.root.join('client/javascripts')
end

Now rake js:routes ignores paths starting with "/rails" or "/sidekiq".

Command line parameters

You can override the coniguration via command line parameters:

rake js:routes exclude_paths='^/rails'

The command still ignores "/rails" but includes "/sidekiq".

Rename route

You can rename route in route_filter:

# Rakefile
JSRailsRoutes.configure do |c|
  c.route_filter = -> (route) do
    # Remove common prefix if route's name starts with it.
    route.name = route.name[4..-1] if route.name.start_with?('foo_')
    true
  end
end

Install

Your Rails Gemfile:

gem 'js_rails_routes', group: :development

License

MIT