Ruby on rails 什么';当您有一个可重用的小部件时,在rails中执行UJS的最佳方法是什么?
在我当前的项目中,我有几个实例,其中我有一个可重用的表单,它存在于rails部分中。此表单通过ajax提交给特定的控制器(:remote=>true)。控制器执行一些操作,然后返回相应的js.erb以通过javascript修改页面 当我只有一个视图时,这很好用。但是当这个可重用的部分存在于多个视图中时,问题似乎就发生了。在视图1中,我可能希望发出一组与视图2中完全不同的javascript命令 作为一个具体的例子,假设我有一个具有正常CRUD操作的comments控制器 我现在有一部分被称为_comments_box.erb。此_comments_box.erb包含通过简单行提交评论的功能:Ruby on rails 什么';当您有一个可重用的小部件时,在rails中执行UJS的最佳方法是什么?,ruby-on-rails,ruby-on-rails-3,partials,ujs,Ruby On Rails,Ruby On Rails 3,Partials,Ujs,在我当前的项目中,我有几个实例,其中我有一个可重用的表单,它存在于rails部分中。此表单通过ajax提交给特定的控制器(:remote=>true)。控制器执行一些操作,然后返回相应的js.erb以通过javascript修改页面 当我只有一个视图时,这很好用。但是当这个可重用的部分存在于多个视图中时,问题似乎就发生了。在视图1中,我可能希望发出一组与视图2中完全不同的javascript命令 作为一个具体的例子,假设我有一个具有正常CRUD操作的comments控制器 我现在有一部分被称为_
- form_for comment, :url => post_comments_path(post), :remote => true do |f|
这将提交到comments_controller.rb create方法,该方法如下所示:
def create
... do some stuff, like create a new comments model
respond_to do |format|
# will respond with create.js.erb
format.js
end
end
create.js.erb反过来向视图添加注释,可能会对DOM进行一系列其他更新
假设我在一个名为post_summary.erb的视图中呈现_comments_box.erb。现在我有了另一个视图,post_detail.erb,它需要相同的_comments_box.erb。然而,post_detail.erb要求我更新DOM上完全不同的div以响应新的注释
我需要为每个实例化创建不同的JS响应。因此,我可以:
- 创建一个备用的控制器方法,比如Create_2。将一些参数从post_detail.erb传递到_comments_box.erb partial,传递到_comments_box.erb,以便它知道要触发哪个控制器方法。这将允许我有一个单独的文件_create_2.js.erb,它将允许我独立操作post_detail.erb视图
- 完全忘记使用js.erb,只需使用普通的旧AJAX并返回JSON,并在客户端完全处理javascript操作
似乎选项1允许我继续使用Rails支持的UJS,这很好。但也意味着我可能会在任何地方添加大量重复的代码,这很烦人。在继续使用UJS的同时,我有没有办法优雅地做到这一点?这正是Apotomo的目的: 以下是它自己的描述: Apotomo是一个真正的MVC小部件框架 用于轨道。小部件基于单元格 并提供可重用的视图组件。 他们知道什么时候有泡泡活动 以及如何通过AJAX更新自己 使用Apotomo小部件几乎可以 感觉像是在开发GUI组件—— 在Rails环境中
试试看,这很好。我不建议在前端应用程序中使用UJS:服务器不应该处理客户端业务。我同意它有用且干净,但它缺乏性能,因此应该保留用于后端(RJS将进入gem,请参见此处:) 也就是说,回到您公开的解决方案:
- 1) 我认为您不需要额外的控制器,您只需要传递额外的参数就可以知道查询来自何处。一个
就可以做到这一点。使用此信息,渲染好的hidden_字段
文件js.erb
format.js { if condition render "create.js.erb" else render "create_2.js.erb" end }
- 2) 我会选择它并返回json,但您将面临同样的问题:知道请求来自何处
隐藏字段
)可能是检查控制器操作中的请求。通过这种方式,您可以利用以下事实:每个上下文都有一个唯一的URL,并且在呈现小部件部分时不必显式指定另一个唯一的值。您是否试图在注释创建中避免重复代码(在respond_to
块之前)或者在不同的js.erb
响应中?我想根据我来自哪个起点来考虑不同的js.erb响应。基本上,我希望有一个可重用的小部件,允许根据上下文进行不同的UI更改。谢谢,这看起来确实很有希望。谢谢,这是我最终得到的解决方案。我在共享小部件表单中添加了一个隐藏的_字段参数“from”。这使我能够决定如何返回正确的erb。随着时间的推移,我可能会不再使用UJS,因为它看起来有点黑客。对于选项2,我的想法是返回json,并始终允许页面上的Javascript决定如何呈现页面。onready我将加载适当的JS文件,它将在ajax上响应:success。我可以使用Backbone.js更好地组织我的javascript。在两个地方复制模型/控制器似乎是错误的,因为您还可以使用模板,例如清理js