Generates javascript file that defines all Rails named routes as javascript helpers
Your Rails Gemfile:
gem "js-routes"
Require js routes file in application.js
or other bundle
/*
= require js-routes
*/
Also in order to flush asset pipeline cache sometimes you might need to run:
rake tmp:cache:clear
This cache is not flushed on server restart in development environment.
Important: If routes.js file is not updated after some configuration change you need to run this command again.
If you need to customize routes file create initializer, like config/initializers/jsroutes.rb
:
JsRoutes.setup do |config|
config.option = value
end
Available options:
default_url_options
- default parameters to be used to generate url- Note that currently only optional parameters (like
:format
) can be defaulted. - Example: {:format => "json"}
- Default: {}
- Note that currently only optional parameters (like
exclude
- Array of regexps to exclude from js routes.- Note that regexp applied to named route not to URL
- Default: []
include
- Array of regexps to include in js routes.- Note that regexp applied to named route not to URL
- Default: []
namespace
- global object used to access routes.- Supports nested namespace like
MyProject.routes
- Default:
Routes
- Supports nested namespace like
prefix
- String representing a url path to prepend to all paths.- Example:
http://yourdomain.com
. This will cause route helpers to generate full path only. - Default: blank
- Example:
You can generate routes files on the application side like this:
JsRoutes.generate!("#{path}/app_routes.js", :namespace => "AppRoutes", :exclude => [/^admin_/, /^api_/])
JsRoutes.generate!("#{path}/adm_routes.js", :namespace => "AdmRoutes", :include => /^admin_/)
JsRoutes.generate!("#{path}/api_routes.js", :namespace => "ApiRoutes", :include => /^api_/, :default_url_options => {:format => "json"})
In order to generate javascript to string and manipulate them yourself use: Like:
routes_js = JsRoutes.generate(options)
Configuration above will create a nice javascript file with Routes
object that has all the rails routes available:
Routes.users_path() // => "/users"
Routes.user_path(1) // => "/users/1"
Routes.user_path(1, {format: 'json'}) // => "/users/1.json"
Routes.new_user_project_path(1, {format: 'json'}) // => "/users/1/projects/new.json"
Routes.user_project_path(1,2, {q: 'hello', custom: true}) // => "/users/1/projects/2?q=hello&custom=true"
Routes.user_project_path(1,2, {hello: ['world', 'mars']}) // => "/users/1/projects/2?hello%5B%5D=world&hello%5B%5D=mars"
Using serialized object as route function arguments:
var google = {id: 1, name: "Google"};
Routes.company_path(google) // => "/companies/1"
var google = {id: 1, name: "Google", to_param: "google"};
Routes.company_path(google) // => "/companies/google"
In order to make routes helpers available globally:
jQuery.extend(window, Routes)
js-routes itself do not have security holes. It makes URLs
without access protection more reachable by potential attacker.
In order to prevent this use :exclude
option for sensitive urls like /admin_/
When using Spork and Spork.trap_method(Rails::Application::RoutesReloader, :reload!)
you should also do:
Spork.trap_method(JsRoutes, :generate!)
There are some alternatives available. Most of them has only basic feature and don't reach the level of quality I accept. Advantages of this one are:
- Rails3 support
- Rich options set
- Support Rails
#to_param
convention for seo optimized paths - Well tested