rails 1.1以上版本提供了强大优雅的RJS,可能执行一个请求多个更新。
有些时候我们并不需要请求服务器,只想在浏览器上执行某些脚本更新,但又想使用RJS。所以为RoR增加了这项功能。
使用方法:
<script language="javascript">
<%=
render :update do |page|
page.define_action 'test_action' do
page.call_script <<-EOS
alert(params.comment.title);
alert(params.comment.body);
EOS
page.replace_html 'errors', 'ERROR'
end
page.define_action 'link_action' do
page.replace_html 'errors', 'ERROR'
end
end
%>
</script>
<div id="errors"></div>
<%= form_local_tag :html => {:action => 'test_action'} %>
<input name="comment[title]" /><br />
<input name="comment[body]" /><br />
<%= submit_tag 'Create' %>
<%= end_form_tag %>
<%= link_to_local 'Test', :action => 'link_action()' %>
上面演示了form_local_tag和link_to_local的使用,打开这个页面以后,可以关掉服务器测试,会发现它不请求服务器也能执行相应脚本。
define_action定义一个脚本函数,call_script用来实现javascript和RJS代码的混合。当使用form_local_tag时,action方法的参数已经被处理过,所以可以直接在action中使用params.comment.title。
当然现在还不完善,比如还只能使用转换完的页面模板,一些动态页面将看不出效果。要做到这点,需要用javascript实现一整套的ActionView辅助方法。
下面提供一个针对rails 1.1.2的一个补丁文件:
补丁文件下载