Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
afdecbc0
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
afdecbc0
编写于
9月 24, 2009
作者:
B
Bob Remeika
提交者:
Stefan Penner
1月 27, 2010
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Took another stab at observe_field. Now implementing data only helpers as script elements.
上级
d383f057
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
69 addition
and
34 deletion
+69
-34
actionpack/lib/action_view/helpers/ajax_helper.rb
actionpack/lib/action_view/helpers/ajax_helper.rb
+41
-11
actionpack/test/javascript/ajax_test.rb
actionpack/test/javascript/ajax_test.rb
+28
-23
未找到文件。
actionpack/lib/action_view/helpers/ajax_helper.rb
浏览文件 @
afdecbc0
...
...
@@ -80,21 +80,51 @@ def observe_field(name, options = {})
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
...
...
actionpack/test/javascript/ajax_test.rb
浏览文件 @
afdecbc0
...
...
@@ -112,6 +112,8 @@ class LegacyButtonToRemoteTest < ButtonToRemoteTest
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 @@ def field(options = {})
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
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录