Class: JsRoutes

Inherits:
Object
  • Object
show all
Defined in:
lib/js_routes.rb,
lib/js_routes/engine.rb,
lib/js_routes/version.rb

Defined Under Namespace

Classes: Configuration, Engine, SprocketsExtension

Constant Summary collapse

DEFAULT_PATH =

OPTIONS

File.join('app','assets','javascripts','routes.js')
DEFAULTS =
{
  namespace: "Routes",
  exclude: [],
  include: //,
  file: DEFAULT_PATH,
  prefix: -> { Rails.application.config.relative_url_root || "" },
  url_links: false,
  camel_case: false,
  default_url_options: {},
  compact: false,
  serializer: nil,
  special_options_key: "_options",
  application: -> { Rails.application }
}
NODE_TYPES =
{
  GROUP: 1,
  CAT: 2,
  SYMBOL: 3,
  OR: 4,
  STAR: 5,
  LITERAL: 6,
  SLASH: 7,
  DOT: 8
}
LAST_OPTIONS_KEY =
"options".freeze
FILTERED_DEFAULT_PARTS =
[:controller, :action]
URL_OPTIONS =
[:protocol, :domain, :host, :port, :subdomain]
VERSION =
"1.4.6"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ JsRoutes

Implementation



110
111
112
# File 'lib/js_routes.rb', line 110

def initialize(options = {})
  @configuration = self.class.configuration.merge(options)
end

Class Method Details

.configurationObject



85
86
87
# File 'lib/js_routes.rb', line 85

def configuration
  @configuration ||= Configuration.new
end

.generate(opts = {}) ⇒ Object



89
90
91
# File 'lib/js_routes.rb', line 89

def generate(opts = {})
  new(opts).generate
end

.generate!(file_name = nil, opts = {}) ⇒ Object



93
94
95
96
97
98
99
# File 'lib/js_routes.rb', line 93

def generate!(file_name=nil, opts = {})
  if file_name.is_a?(Hash)
    opts = file_name
    file_name = opts[:file]
  end
  new(opts).generate!(file_name)
end

.json(string) ⇒ Object



101
102
103
# File 'lib/js_routes.rb', line 101

def json(string)
  ActiveSupport::JSON.encode(string)
end

.optionsObject



80
81
82
83
# File 'lib/js_routes.rb', line 80

def options
  ActiveSupport::Deprecation.warn('JsRoutes.options method is deprecated use JsRoutes.configuration instead')
  configuration
end

.setup(&block) ⇒ Object



76
77
78
# File 'lib/js_routes.rb', line 76

def setup(&block)
  configuration.tap(&block) if block
end

Instance Method Details

#generateObject



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/js_routes.rb', line 114

def generate
  # Ensure routes are loaded. If they're not, load them.
  if named_routes.to_a.empty? && application.respond_to?(:reload_routes!)
    application.reload_routes!
  end

  {
    "GEM_VERSION"         => JsRoutes::VERSION,
    "ROUTES"              => js_routes,
    "NODE_TYPES"          => json(NODE_TYPES),
    "RAILS_VERSION"       => ActionPack.version,
    "DEPRECATED_GLOBBING_BEHAVIOR" => ActionPack::VERSION::MAJOR == 4 && ActionPack::VERSION::MINOR == 0,

    "APP_CLASS"           => application.class.to_s,
    "NAMESPACE"           => json(@configuration.namespace),
    "DEFAULT_URL_OPTIONS" => json(@configuration.default_url_options),
    "PREFIX"              => json(@configuration.prefix),
    "SPECIAL_OPTIONS_KEY" => json(@configuration.special_options_key),
    "SERIALIZER"          => @configuration.serializer || json(nil),
  }.inject(File.read(File.dirname(__FILE__) + "/routes.js")) do |js, (key, value)|
    js.gsub!(key, value.to_s)
  end
end

#generate!(file_name = nil) ⇒ Object



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/js_routes.rb', line 138

def generate!(file_name = nil)
  # Some libraries like Devise do not yet loaded their routes so we will wait
  # until initialization process finish
  # https://github.com/railsware/js-routes/issues/7
  Rails.configuration.after_initialize do
    file_name ||= self.class.configuration['file']
    file_path = Rails.root.join(file_name)
    js_content = generate

    # We don't need to rewrite file if it already exist and have same content.
    # It helps asset pipeline or webpack understand that file wasn't changed.
    return if File.exist?(file_path) && File.read(file_path) == js_content

    File.open(file_path, 'w') do |f|
      f.write js_content
    end
  end
end