首先,2种常见(基本)方法:
# returning from some FoosController method
respond_to do |format|
# 1. render the out a json representation
format.json { render :json => @foo }
# 2. render an RJS template, say update.js.erb
format.js { render }
end
# in update.js.erb
$('#foo').html("<%= escape_javascript(render(@foo)) %>")
这些显然很简单,但我想说明我在说什么。我相信这些也是rails 3中默认响应者所期望的情况(动作命名的默认模板或在资源上调用_#{format}。)
使用1,您可以在视图方面获得完全的灵活性而无需担心模板,但您必须通过javascript直接操作DOM。你无法访问助手,部分等等。
使用2,您可以使用部分和帮助程序,但是您可以绑定到一个模板(默认情况下至少)。所有使JS调用FoosController的视图都使用相同的模板,这并不完全灵活。
1。)事先将我需要的部分/帮助转移到javascript中,然后将它们插入到页面中,使用字符串替换来定制它们返回的结果(在名称,id等中进行修改)。
2.)将视图逻辑放在模板中。例如,查找特定的DOM元素并执行一项(如果存在),如果不存在,则执行另一项。
3.。)在控制器中放置逻辑以呈现不同的模板。例如,在多态属于可以为comments / foo或posts / foo调用更新的地方,渲染commnts / foos / update.js.erb与posts / foos / update.js.erb。
我已经使用了所有这些(可能还有其他我没想过的)。通常在同一个应用程序中,这会导致令人困惑的代码。这种事情有最好的做法吗?这似乎是一个常见的用例,您希望通过不同视图中的Ajax操作调用控制器,并期望发生不同的事情(无需执行诸如转义和字符串替换部分和帮助客户端等繁琐的事情。)< / p>
有什么想法吗?
答案 0 :(得分:5)
最佳做法是让您的Web UI使用RESTful API。也就是说,使用在客户端中运行的JavaScript来获取和放置JSON格式的资源,就像第三方可能使用RestClient
获取并以JSON格式放置资源一样。这意味着您在服务器上没有.rjs
或.js.erb
模板 - 您可能会使用Mustache或Handlebars或jQuery模板,以及嵌入(或静态链接到)HTML的粘合JavaScript最初发送给Web客户端的页面。
当然,使用remote => true
,转到服务器并呈现JavaScript代码模板以生成将在客户端上执行的JavaScript的快速而简单的方法更容易。这段时间相当不错。但是我们现在需要用于数据格式的JavaScript,而且我们现在拥有卓越的功能,可以用JSON格式提取数据并在客户端中呈现模板。
答案 1 :(得分:0)
不确定这是否适合您,但我会执行以下操作:
这假设模板实际上可以是静态的,这取决于手头的情况。但通常这应该有用。