RJS 模板会膨胀的,但在你应用程序的其它部分使用这些方法却很好。是否可以在你的 ptototype 回调或静态 javascipt 文件内使用奇妙的 javascript 辅助方法呢?
下面是个例子:
<%= link_to_function('reorder', update_page do |page|
page.send :record, sortable_element('items',
:url => viewbox_url(:action => 'reorder',
:id => @view.id)).match(/Sortable.create[^n]+/)
page.hide 'contents_controls'
page.show 'contents_reorderable'
end) %>
如果你深入探究 RJS 模板是如何工作的,它基本上执行的代码在一个 update_page 块内。在 #link_to_function 内我所要做的是在 link 的 onclick 事件内输出结果。然而,若你希望 HTML 整洁些的话。我们可以把它放在一个 javascript 库内。
创建控制器:
我们希望 URL 看起来与任何旧的 javascript 如 ‘javascripts/foo.js’ 类似。
# generate the controller first
# ./script/generate controller javascripts
# create a route
map.connect 'javascripts/:js', :controller => 'javascripts', :action => 'show',
:requirements => { :js => /.js$/ }
# the controller action
def show
headers["Content-Type"] = 'text/javascript'
render :action => params[:js][0..-4]
end
# the rhtml view
function reorder() {
<%= sortable_element('items', :url =>
viewbox_url(:action => 'reorder', :id => @view.id)).match(/Sortable.create[^n]+/) %>
<% update_page do |page|
page.hide 'contents_controls'
page.show 'contents_reorderable'
end -%>
}
还有什么?
你可以打开页面缓存以便不用每次都渲染 javascript 视图。这就是为什么用 .js 扩展名定义路由是必须的。如果对你当前静态内容缓存 js 文件有问题的话,可以给你的 javascript 控制器一个不同的路径。
现在你有了这个 javascript 控制器,你可以使用它来加强其它的 javascript 函数,如 AJAX 调用。特别是如果你喜欢使用 Behavior 库来添加回调,这会让你感到相当方便。
http://habtm.com/articles/2005/12/15/another-use-for-rjs-templates
http://my4java.itpub.net/post/9983/215442