aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorBob Remeika <bob.remeika@gmail.com>2009-09-24 00:18:52 -0700
committerStefan Penner <stefan.penner@gmail.com>2010-01-27 12:44:30 -0600
commitafdecbc0a85fb6a61e58b8017f476fe29507e6bf (patch)
tree00debee1529cf0659f912638b71636902a01542b /actionpack
parentd383f057c0821faf1d1d472b471628b37cf8d67c (diff)
downloadrails-afdecbc0a85fb6a61e58b8017f476fe29507e6bf.tar.gz
rails-afdecbc0a85fb6a61e58b8017f476fe29507e6bf.tar.bz2
rails-afdecbc0a85fb6a61e58b8017f476fe29507e6bf.zip
Took another stab at observe_field. Now implementing data only helpers as script elements.
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/lib/action_view/helpers/ajax_helper.rb52
-rw-r--r--actionpack/test/javascript/ajax_test.rb51
2 files changed, 69 insertions, 34 deletions
diff --git a/actionpack/lib/action_view/helpers/ajax_helper.rb b/actionpack/lib/action_view/helpers/ajax_helper.rb
index fce756869c..05e5fca484 100644
--- a/actionpack/lib/action_view/helpers/ajax_helper.rb
+++ b/actionpack/lib/action_view/helpers/ajax_helper.rb
@@ -80,21 +80,51 @@ module ActionView
script_decorator(attributes)
end
- def observe_field(name, options = {}, html_options = {})
- url = options.delete(:url)
- url = url_for(url) if url.is_a?(Hash)
+ def observe_field(name, options = {})
+ if options[:url]
+ options[:url] = options[:url].is_a?(Hash) ? url_for(options[:url]) : options[:url]
+ end
+
+ if options[:frequency]
+ case options[:frequency]
+ when 0
+ options.delete(:frequency)
+ else
+ options[:frequency] = options[:frequency].to_i
+ end
+ end
- frequency = options.delete(:frequency)
- if frequency && frequency > 0
- html_options[:"data-frequency"] = frequency
+ if options[:with] && (options[:with] !~ /[\{=(.]/)
+ options[:with] = "'#{options[:with]}=' + encodeURIComponent(value)"
+ else
+ options[:with] ||= 'value' unless options[:function]
+ end
+
+ if options[:function]
+ statements = options[:function] # || remote_function(options) # TODO: Need to implement remote function - BR
+ options[:function] = JSFunction.new(statements, "element", "value")
end
- html_options.merge!(:style => "display:none",
- :"data-observe-field" => name,
- :"data-observe" => true,
- :"data-url" => url)
+ options[:name] = name
+
+ <<-SCRIPT
+ <script type="application/json" data-rails-type="observe_field">
+ //<![CDATA[
+ #{options.to_json}
+ // ]]>
+ </script>
+ SCRIPT
+ end
+
+ # TODO: Move to javascript helpers - BR
+ class JSFunction
+ def initialize(statements, *arguments)
+ @statements, @arguments = statements, arguments
+ end
- tag(:div, html_options)
+ def as_json(options = nil)
+ "function(#{@arguments.join(", ")}) {#{@statements}}"
+ end
end
module Rails2Compatibility
diff --git a/actionpack/test/javascript/ajax_test.rb b/actionpack/test/javascript/ajax_test.rb
index e46e346d79..97a69ba732 100644
--- a/actionpack/test/javascript/ajax_test.rb
+++ b/actionpack/test/javascript/ajax_test.rb
@@ -112,6 +112,8 @@ class ButtonToRemoteTest < AjaxTestCase
end
end
+# TODO: We need a better way to test JSON being returned from data only helpers - BR
+# TODO: We might also need a lower level data only helper method??? - BR
class ObserveFieldTest < AjaxTestCase
def protect_against_forgery?
false
@@ -123,46 +125,49 @@ class ObserveFieldTest < AjaxTestCase
test "basic" do
assert_html field,
- %w(div style="display:none" data-observe="true" data-observe-field="title")
+ %w(script type="application/json" data-rails-type="observe_field")
end
test "using a url string" do
assert_html field(:url => "/some/other/url"),
- %w(data-url="/some/other/url")
+ %w("url":"/some/other/url")
end
test "using a url hash" do
assert_html field(:url => {:controller => :blog, :action => :update}),
- %w(data-url="/url/hash")
+ %w("url":"/url/hash")
end
- test "with a :frequency option" do
+ test "using a :frequency option" do
assert_html field(:frequency => 5.minutes),
- %w(data-frequency="300")
+ %w("frequency":300)
end
- test "with a :frequency option of 0" do
- assert_no_match /data-frequency/, field(:frequency => 0)
+ test "using a :frequency option of 0" do
+ assert_no_match /frequency/, field(:frequency => 0)
end
+ # TODO: Finish when remote_function or some equivilent is finished -BR
# def test_observe_field
# assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nnew Form.Element.Observer('glass', 300, function(element, value) {new Ajax.Request('http://www.example.com/reorder_if_empty', {asynchronous:true, evalScripts:true, parameters:value})})\n//]]>\n</script>),
# observe_field("glass", :frequency => 5.minutes, :url => { :action => "reorder_if_empty" })
# end
-#
-# def test_observe_field_using_with_option
-# expected = %(<script type=\"text/javascript\">\n//<![CDATA[\nnew Form.Element.Observer('glass', 300, function(element, value) {new Ajax.Request('http://www.example.com/check_value', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(value)})})\n//]]>\n</script>)
-# assert_dom_equal expected, observe_field("glass", :frequency => 5.minutes, :url => { :action => "check_value" }, :with => 'id')
-# assert_dom_equal expected, observe_field("glass", :frequency => 5.minutes, :url => { :action => "check_value" }, :with => "'id=' + encodeURIComponent(value)")
-# end
-#
-# def test_observe_field_using_json_in_with_option
-# expected = %(<script type=\"text/javascript\">\n//<![CDATA[\nnew Form.Element.Observer('glass', 300, function(element, value) {new Ajax.Request('http://www.example.com/check_value', {asynchronous:true, evalScripts:true, parameters:{'id':value}})})\n//]]>\n</script>)
-# assert_dom_equal expected, observe_field("glass", :frequency => 5.minutes, :url => { :action => "check_value" }, :with => "{'id':value}")
-# end
-#
-# def test_observe_field_using_function_for_callback
-# assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nnew Form.Element.Observer('glass', 300, function(element, value) {alert('Element changed')})\n//]]>\n</script>),
-# observe_field("glass", :frequency => 5.minutes, :function => "alert('Element changed')")
-# end
+
+ # TODO: Consider using JSON instead of strings. Is using 'value' as a magical reference to the value of the observed field weird? (Rails2 does this) - BR
+ test "using a :with option" do
+ assert_html field(:with => "foo"),
+ %w("with":"'foo=' + encodeURIComponent(value)")
+ assert_html field(:with => "'foo=' + encodeURIComponent(value)"),
+ %w("with":"'foo=' + encodeURIComponent(value)")
+ end
+
+ test "using json in a :with option" do
+ assert_html field(:with => "{'id':value}"),
+ %w("with":"{'id':value}")
+ end
+
+ test "using :function for callback" do
+ assert_html field(:function => "alert('Element changed')"),
+ %w("function":"function(element, value) {alert('Element changed')}")
+ end
end