在restful/resourceful控制器中,jails模板的Rails最佳实践是什么?

num*_*407 8 javascript rest resources templates ruby-on-rails

首先,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)) %>")
Run Code Online (Sandbox Code Playgroud)

这些显然是简单的案例,但我想说明我在说什么.我相信这些也是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操作调用控制器并期望发生不同的事情(无需执行诸如转义和字符串替换部分和帮助程序客户端等繁琐的事情).

有什么想法吗?

yfe*_*lum 5

最佳做法是让Web UI使用RESTful API.也就是说,使用在客户端中运行的JavaScript来获取和放置JSON格式的资源,就像第三方可能使用JSON格式获取和放置资源一样RestClient.这意味着您没有服务器上的模板.rjs.js.erb模板 - 您可能会使用Mustache或Handlebars或jQuery模板,以及嵌入(或静态链接到)最初提供给Web客户端的HTML页面的粘合JavaScript.

当然,使用remote => true和访问服务器以及渲染JavaScript代码模板以生成将在客户端上执行的JavaScript的快速而简单的方法更容易.这段时间相当不错.但我们现在需要用于数据格式的JavaScript,而且我们现在拥有卓越的功能,可以在JSON格式中提取数据并在客户端中呈现模板.