Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 什么';当您有一个可重用的小部件时,在rails中执行UJS的最佳方法是什么?_Ruby On Rails_Ruby On Rails 3_Partials_Ujs - Fatal编程技术网

Ruby on rails 什么';当您有一个可重用的小部件时,在rails中执行UJS的最佳方法是什么?

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控制器 我现在有一部分被称为_

在我当前的项目中,我有几个实例,其中我有一个可重用的表单,它存在于rails部分中。此表单通过ajax提交给特定的控制器(:remote=>true)。控制器执行一些操作,然后返回相应的js.erb以通过javascript修改页面

当我只有一个视图时,这很好用。但是当这个可重用的部分存在于多个视图中时,问题似乎就发生了。在视图1中,我可能希望发出一组与视图2中完全不同的javascript命令

作为一个具体的例子,假设我有一个具有正常CRUD操作的comments控制器

我现在有一部分被称为_comments_box.erb。此_comments_box.erb包含通过简单行提交评论的功能:

- 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