diff --git a/actionpack/lib/action_view/helpers/asset_tag_helper.rb b/actionpack/lib/action_view/helpers/asset_tag_helper.rb
index 83357dd76f64730ed7c3ef49f1b0bce3a2f8063c..4df99f8293bce65e0f022ec77945c511eacdaaeb 100644
--- a/actionpack/lib/action_view/helpers/asset_tag_helper.rb
+++ b/actionpack/lib/action_view/helpers/asset_tag_helper.rb
@@ -140,7 +140,7 @@ module AssetTagHelper
:stylesheets_dir => "#{assets_dir}/stylesheets",
}
- JAVASCRIPT_DEFAULT_SOURCES = ['prototype', 'effects', 'dragdrop', 'controls'].freeze unless const_defined?(:JAVASCRIPT_DEFAULT_SOURCES)
+ JAVASCRIPT_DEFAULT_SOURCES = ['prototype', 'effects', 'dragdrop', 'controls', 'rails'].freeze unless const_defined?(:JAVASCRIPT_DEFAULT_SOURCES)
# Returns a link tag that browsers and news readers can use to auto-detect
# an RSS or ATOM feed. The +type+ can either be :rss (default) or
diff --git a/actionpack/test/template/asset_tag_helper_test.rb b/actionpack/test/template/asset_tag_helper_test.rb
index 57802ebf42a39c781fcabfd38c962a5cc61d47d3..586de667142629826637130bc24c67bef0c4ff06 100644
--- a/actionpack/test/template/asset_tag_helper_test.rb
+++ b/actionpack/test/template/asset_tag_helper_test.rb
@@ -86,11 +86,11 @@ def teardown
%(javascript_include_tag("bank.js")) => %(),
%(javascript_include_tag("bank", :lang => "vbscript")) => %(),
%(javascript_include_tag("common.javascript", "/elsewhere/cools")) => %(\n),
- %(javascript_include_tag(:defaults)) => %(\n\n\n\n),
+ %(javascript_include_tag(:defaults)) => %(\n\n\n\n\n),
%(javascript_include_tag(:all)) => %(\n\n\n\n\n\n\n),
%(javascript_include_tag(:all, :recursive => true)) => %(\n\n\n\n\n\n\n\n),
- %(javascript_include_tag(:defaults, "bank")) => %(\n\n\n\n\n),
- %(javascript_include_tag("bank", :defaults)) => %(\n\n\n\n\n),
+ %(javascript_include_tag(:defaults, "bank")) => %(\n\n\n\n\n\n),
+ %(javascript_include_tag("bank", :defaults)) => %(\n\n\n\n\n\n),
%(javascript_include_tag("http://example.com/all")) => %(),
%(javascript_include_tag("http://example.com/all.js")) => %(),
@@ -235,7 +235,7 @@ def test_javascript_include_tag_with_missing_source
def test_javascript_include_tag_with_given_asset_id
ENV["RAILS_ASSET_ID"] = "1"
- assert_dom_equal(%(\n\n\n\n), javascript_include_tag(:defaults))
+ assert_dom_equal(%(\n\n\n\n\n), javascript_include_tag(:defaults))
end
def test_javascript_include_tag_is_html_safe
@@ -246,14 +246,14 @@ def test_javascript_include_tag_is_html_safe
def test_register_javascript_include_default
ENV["RAILS_ASSET_ID"] = ""
ActionView::Helpers::AssetTagHelper::register_javascript_include_default 'bank'
- assert_dom_equal %(\n\n\n\n\n), javascript_include_tag(:defaults)
+ assert_dom_equal %(\n\n\n\n\n\n), javascript_include_tag(:defaults)
end
def test_register_javascript_include_default_mixed_defaults
ENV["RAILS_ASSET_ID"] = ""
ActionView::Helpers::AssetTagHelper::register_javascript_include_default 'bank'
ActionView::Helpers::AssetTagHelper::register_javascript_include_default 'robber', '/elsewhere/cools.js'
- assert_dom_equal %(\n\n\n\n\n\n\n), javascript_include_tag(:defaults)
+ assert_dom_equal %(\n\n\n\n\n\n\n\n), javascript_include_tag(:defaults)
end
def test_custom_javascript_expansions
@@ -265,7 +265,7 @@ def test_custom_javascript_expansions
def test_custom_javascript_expansions_and_defaults_puts_application_js_at_the_end
ENV["RAILS_ASSET_ID"] = ""
ActionView::Helpers::AssetTagHelper::register_javascript_expansion :robbery => ["bank", "robber"]
- assert_dom_equal %(\n\n\n\n\n\n\n\n), javascript_include_tag('controls',:defaults, :robbery, 'effects')
+ assert_dom_equal %(\n\n\n\n\n\n\n\n\n), javascript_include_tag('controls',:defaults, :robbery, 'effects')
end
def test_custom_javascript_expansions_with_undefined_symbol
@@ -965,6 +965,5 @@ def test_asset_host_without_protocol_should_use_request_protocol_even_if_path_pr
def test_assert_css_and_js_of_the_same_name_return_correct_extension
assert_dom_equal(%(/collaboration/hieraki/javascripts/foo.js), javascript_path("foo"))
assert_dom_equal(%(/collaboration/hieraki/stylesheets/foo.css), stylesheet_path("foo"))
-
end
end
diff --git a/railties/Rakefile b/railties/Rakefile
index eff59f1f40e43ac1e48cbccbe2397572706876e0..b8f5e81b85045fb4bf68af73e31bd8747834cc82 100644
--- a/railties/Rakefile
+++ b/railties/Rakefile
@@ -64,6 +64,10 @@ task :generate_guides do
ruby "guides/rails_guides.rb"
end
+task :update_prototype_ujs do
+ system "curl http://github.com/rails/prototype-ujs/raw/master/src/rails.js > lib/generators/rails/app/templates/public/javascripts/rails.js"
+end
+
# Generate documentation ------------------------------------------------------------------
Rake::RDocTask.new { |rdoc|
diff --git a/railties/lib/generators/rails/app/templates/public/javascripts/rails.js b/railties/lib/generators/rails/app/templates/public/javascripts/rails.js
new file mode 100644
index 0000000000000000000000000000000000000000..2a0a05d25f87891255d5ba5ff5a3ee003c1d80d9
--- /dev/null
+++ b/railties/lib/generators/rails/app/templates/public/javascripts/rails.js
@@ -0,0 +1,77 @@
+document.observe("dom:loaded", function() {
+ function handleRemote(element) {
+ var method, url, params;
+
+ if (element.tagName.toLowerCase() == 'form') {
+ method = element.readAttribute('method') || 'post';
+ url = element.readAttribute('action');
+ params = element.serialize(true);
+ } else {
+ method = element.readAttribute('data-method') || 'get';
+ // TODO: data-url support is going away, just use href
+ url = element.readAttribute('data-url') || element.readAttribute('href');
+ params = {};
+ }
+
+ var event = element.fire("ajax:before");
+ if (event.stopped) return false;
+
+ new Ajax.Request(url, {
+ method: method,
+ parameters: params,
+ asynchronous: true,
+ evalScripts: true,
+
+ onLoading: function(request) { element.fire("ajax:loading", {request: request}); },
+ onLoaded: function(request) { element.fire("ajax:loaded", {request: request}); },
+ onInteractive: function(request) { element.fire("ajax:interactive", {request: request}); },
+ onComplete: function(request) { element.fire("ajax:complete", {request: request}); },
+ onSuccess: function(request) { element.fire("ajax:success", {request: request}); },
+ onFailure: function(request) { element.fire("ajax:failure", {request: request}); }
+ });
+
+ element.fire("ajax:after");
+ }
+
+ $(document.body).observe("click", function(event) {
+ var element = event.findElement("a[data-remote=true]");
+ if (element) {
+ handleRemote(element);
+ event.stop();
+ }
+ });
+
+ $(document.body).observe("ajax:before", function(event) {
+ var message = event.element().readAttribute('data-confirm');
+ if (message && !confirm(message)) event.stop();
+ });
+
+ // TODO: I don't think submit bubbles in IE
+ $(document.body).observe("submit", function(event) {
+ var inputs = event.element().select("input[type=submit][data-disable-with]");
+ inputs.each(function(input) {
+ input.disabled = true;
+ input.writeAttribute('data-original-value', input.value);
+ input.value = input.readAttribute('data-disable-with');
+ });
+
+ var element = event.findElement("form[data-remote=true]");
+ if (element) {
+ handleRemote(element);
+ event.stop();
+ }
+ });
+
+ $(document.body).observe("ajax:complete", function(event) {
+ var element = event.element();
+
+ if (element.tagName.toLowerCase() == 'form') {
+ var inputs = element.select("input[type=submit][disabled=true][data-disable-with]");
+ inputs.each(function(input) {
+ input.value = input.readAttribute('data-original-value');
+ input.writeAttribute('data-original-value', null);
+ input.disabled = false;
+ });
+ }
+ });
+});