IT虾米网

javascript之JSON 模板

zhwl 2024年01月13日 编程语言 141 0

作为一点背景知识,我正处于大型 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 移动应用程序框架)并计划将其开源,但我相信他们已经开始偏离构建它的一些想法,所以我不认为知道状态是什么。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!