作为一点背景知识,我正处于大型 RoR 的早期设计阶段 我工作的公司的项目,我们计划坚持 future 5-10 年的 Rails。我们在这个项目中 我们正在尝试获得一些好的做法并自定义框架以 为我们需要的东西工作。我们考虑了 使用完整的网络应用程序(Backbone.js 风格)与 a 的优缺点 静态有限的基于 JS 的 Rails 应用程序。虽然我们很想去 使用 webapp,我确定使用 Backbone.js 会 原因:
- 完全复制 View 和路由(从长远来看是一个维护问题)
- 难以跟踪多态关联及其路径
- 不允许我们在客户端使用 View 助手 (维护问题)
- 部分模型信息重复
- 缓慢的客户端计算机(超出我们的控制范围),这会 运行困难
为了尝试减少这种情况,我们决定采用更加混合的 方法,而是将更多的逻辑推回服务器端,同时 仍然保持 RESTFUL 架构作为 API 最好 可能的。我们计划完成初始页面加载 通常使用 Rails,然后页面上的任何操作都会发送 通过 AJAX 请求并接收回一个 JSON 对象,其中包含 部分呈现,以及一些附加信息(即闪存更新, 对象的 JSON 表示,附加 JS 包括 if 必要等)
我们遇到的问题是,根据我的理解,我们 无法维护 RESTFUL 架构并且有多个 相同数据的部分/ View 。举个例子,如果我想 通过订单/索引从服务器请求订单列表,它会 仅返回数据的一个 View 。如果我有一个扩展表,一个列表, 或我想要请求的部分的其他 View /部分/小部件 用于。
为此,我添加了一个 params[:partial](它是一个附加组件 在为服务器提供两者的路由或 url 参数上 所要求的信息,以及我的观点 我期待它的到来。但是,它本身就可以很好地工作 我还想从 服务器同时(即闪存更新,JSON 表示 数据等)。理想情况下,我们希望它灵活、快速并向下发送 从服务器以 JSON 格式发送。
为此,我按如下方式覆盖了现有的 JSON 响应程序, 你可能会注意到我不得不使用它来渲染 JSON 中的 HAML/ERB 模板:
module ExtraFunctions
def partial_options
params.include?(:partial) ? { :partial => params[:partial] } : {}
end
def flash_options
{ :file => 'layouts/_flash.html.haml' }
end
end
ApplicationController.send :include, ExtraFunctions
#I would love to be using the ERB templating and views
#instead of this kludge. But this will have to do.
ActionController::Renderers.add :json do |json, options|
#Change the format so we can render the html templates
self.formats = [:html]
options = { :layout => false }
partial_opt = options.merge(self.respond_to?(:partial_options) ? self.partial_options : {})
flash_opt = options.merge(self.respond_to?(:flash_options) ? self.flash_options : {})
obj = {
json: json.as_json,
partial: render_to_string(partial_opt),
flash: flash,
flash_partial: render_to_string(flash_opt),
user: @current_user
#js-includes: #Working on this
}
#Change the format back
self.formats = [:json]
json = obj.to_json(options) unless obj.kind_of?(String)
json = "#{options[:callback]}(#{json})" unless options[:callback].blank?
self.content_type ||= Mime::JSON
json
end
你会注意到其中有一个 js-includes 的位置,原因是 那就是我希望在后期有动态包含的能力 使用 head.js 的游戏。这将是为了更容易的依赖管理, 因为最初的观点不会包括一些部分 通过 AJAX 请求(即,如果我抓取一个表单来输入一个新的 地址,并且该表单有一些 AJAX 检查它包含在 在它的顶部使用 content_for 标签)。理想情况下,我真正想要的 这将是一个 JSON 布局,看起来像(虽然有更多 我希望糖衣语法):
** json/application.json.erb **
{
json: <%= json.as_json %>,
partial: <%= render_to_string(partial_opt) %>,
flash: <%= flash %>,
flash_partial: <%= render_to_string(flash_opt) %>,
user: <%= @current_user =>,
js-includes: <%= yield :js_includes %>,
<%= yield =>
}
我已经研究这些考虑因素/问题一段时间了,我的 问题有两个:
1) 关于我们的行为,是否有任何公然尖叫的愚蠢行为? 正在做?是否有更好或更标准的解决方案?
2) 有没有办法让 ERB 渲染 JSON 模板?
谢谢!
请您参考如下方法:
归根结底,这是一个普遍存在的问题,目前还没有强烈的解决方案。
David Heinemeier Hansson 在 RailsConf 2011 上介绍了 Rails 3.1 中的新 Assets 管道时谈到了这个问题,并指出他们已经开始使用他们所谓的 pjax。处理页面的刷新部分并建议它及时成为 Rails 的一部分。
37signals 还构建了 Cinco(全 js 移动应用程序框架)并计划将其开源,但我相信他们已经开始偏离构建它的一些想法,所以我不认为知道状态是什么。