Skip to content

Instantly share code, notes, and snippets.

@corporealfunk
Created May 2, 2012 00:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save corporealfunk/2572582 to your computer and use it in GitHub Desktop.
Save corporealfunk/2572582 to your computer and use it in GitHub Desktop.
Rake Task generate JS Routes functions
desc "Generate a JavaScript file that contains your Rails routes"
namespace :js do
task :routes, [:filename] => :environment do |t, args|
filename = args[:filename].blank? ? "rails_routes.js" : args[:filename]
save_path = "#{Rails.root}/app/assets/javascripts/#{filename}"
routes = generate_routes_for_rails_3
javascript = ""
routes.each do |route|
javascript << generate_method(route[:name], route[:path]) + "\n"
end
File.open(save_path, "w") { |f| f.write(javascript) }
puts "Routes saved to #{save_path}."
end
end
def generate_method(name, path)
compare = /:(.*?)(\/|$)/
path.sub!(compare, "' + params.#{$1} + '#{$2}") while path =~ compare
js_func = %{
function #{name}_path(options){
if(options && options.data) {
var query_string_params = []
for(var key in options.data){
query_string_params.push([key, options.data[key]].join('='));
}
var params = options.params;
return '#{path}?' + query_string_params.join('&');
}else if(options && options.params) {
var params = options.params;
return '#{path}'
}else {
var params = options;
return '#{path}'
}
}}
return js_func
end
def generate_routes_for_rails_3
Rails.application.reload_routes!
processed_routes = []
Rails.application.routes.routes.each do |route|
processed_routes << {:name => route.name, :path => route.path.spec.to_s.split("(")[0]} unless route.name.nil?
end
return processed_routes
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment