Ruby on rails 表单重新加载后的Cocoon回调

Ruby on rails 表单重新加载后的Cocoon回调,ruby-on-rails,cocoon-gem,Ruby On Rails,Cocoon Gem,我正在创建一个表单,用户可以在其中添加许多嵌套问题,每个问题可以有许多嵌套答案,其他字段有ActiveRecord验证程序,当它们失败时,页面会重新加载,插入的字段仍然存在 所有回调(例如cocoon:before insert)都不会重新加载,例如插入对象上下拉列表的更改处理程序 如果在服务器端验证程序上重新加载页面失败,我该如何使这些回调得到尊重 另一方面,在代码质量方面,向调用控制器上的new方法时生成的嵌套对象(即不受插入后/插入前回调影响的对象)添加cocoon回调中创建的处理程序的最

我正在创建一个表单,用户可以在其中添加许多嵌套问题,每个问题可以有许多嵌套答案,其他字段有ActiveRecord验证程序,当它们失败时,页面会重新加载,插入的字段仍然存在

所有回调(例如
cocoon:before insert
)都不会重新加载,例如插入对象上下拉列表的更改处理程序

如果在服务器端验证程序上重新加载页面失败,我该如何使这些回调得到尊重

另一方面,在代码质量方面,向调用控制器上的
new
方法时生成的嵌套对象(即不受插入后/插入前回调影响的对象)添加cocoon回调中创建的处理程序的最佳方法是什么

下面是一些示例coffeescript代码以供澄清:

$(document).ready ->
  $('#questions').on("cocoon:after-insert", (e, added_question) ->
    added_question.find('#type').change ->
      if $(this).val() is "1"
        added_question.find("#answers").hide()
      else
        added_question.find("#answers").show()
编辑:更改了问题,因为删除问题是缺少适当的包装器类


编辑#2:添加示例代码使用rails4时,您正在使用,并且不能再依赖
文档。ready
事件,您应该收听
页面:change
事件

因此,您的代码将变成:

$(window).bind 'page:change', () ->
  $('#questions').on("cocoon:after-insert", (e, added_question) ->
    added_question.find('#type').change ->
      if $(this).val() is "1"
        added_question.find("#answers").hide()
      else
        added_question.find("#answers").show()
或者,您也可以在“页面:更改”上写(()->…),这两个选项完全相同

[更新:替代解决方案]

我没有真正阅读事件处理程序:)几句话:

  • 在插入之前,您可能需要尝试使用
    。那可能行得通
    
  • 其次,您使用的是一个id
    #type
    ,但是一个页面将有多个id?这是自找麻烦:)如果你得到的不止一个,那么使用一个类。此外,请使用更具描述性的名称
有一个更简单的解决方案:jquery可以动态绑定,因此您可以编写

$('#questions').on 'change', '.question-type', () -> 
  var this = $(this)
  var question = $(this).parent('.your-question-class')
  question.toggle()
不确定是否真的需要检查该值,只需切换可见性


这段代码当然没有经过测试,但我希望你能理解它。在
处理程序上查找jquery
,它允许使用选择器捕捉事件。因此,在这种情况下,
#questions
div中,类为
question type
的元素(而不是不正确的
#type
id)上的任何更改事件都将由该处理程序处理。由于它附加到容器元素,因此它将被动态删除。因此,如果添加或删除问题,它仍然有效

如何定义回调处理?在文档就绪事件中?你能展示一些代码吗?您正在使用rails 4吗?是的,它是在一个文档就绪事件中,我添加了一些代码以进行澄清,发生的情况是div#类型上的更改处理程序不再绑定到对象,是的,使用rails 4.0.1实际上我没有使用turbolinks,而是切换到尝试此操作,而$(window).bind现在可以工作了,更改处理程序仍然未应用于现有对象,例如:我通过cocoon插入Q1并更改#type div,从而引发更改回调,然后我提交带有错误的表单,页面发生更改,但Q1对象未插入,因此其保持不变,虽然插入后回调仍然存在并适用于新对象,但对于在页面更改之前创建的对象,它不会启动父方法。父方法正是我所需要的,谢谢,至于切换,这只是示例代码,因为我的实际代码还有一点,但我会研究它,谢谢!这是可行的,但我对TurboLink的多个条目有问题(如cocoon的github页面上的问题#177),因此我也照做,将include标记更改为标题,并将其修复,但是,绑定到问题id的更改处理程序不再有效,你知道为什么吗?