Javascript Rails 4/Ruby 2:partial的局部变量(FormBuilder)通过动态更新丢失

Javascript Rails 4/Ruby 2:partial的局部变量(FormBuilder)通过动态更新丢失,javascript,jquery,ruby-on-rails,ruby,ajax,Javascript,Jquery,Ruby On Rails,Ruby,Ajax,我有一个表单,它呈现了一个用于选择一个人任务的部分 new.html.slim: = form_for(@person) do |f| = f.text_field :name = f.fields_for :assignment do |a| = a.collection_select :project_id, Project.order(:name), :id, :name div id="task_list" = render 'shared/_task

我有一个表单,它呈现了一个用于选择一个人任务的部分

new.html.slim:

= form_for(@person) do |f|
  = f.text_field :name
  = f.fields_for :assignment do |a|
    = a.collection_select :project_id, Project.order(:name), :id, :name
    div id="task_list"
      = render 'shared/_task_select', a: a
  = f.submit 'Save'
= a.collection_select :task_id, @tasks, :id, :name
$(document).ready(function() {
    $('#person_assignment_attributes_project_id').change(function() {
        var selection = $('#person_assignment_attributes_project_id').val();
        $.ajax({
            url: "/create_tasklist",
            data: {
                project_id : selection
            },
            dataType: "script"
        });
    });
});
$("#task_list").html("<%= escape_javascript(render 'shared/task_list', a: a) %>");
shared/\u task\u select.html.slim:

= form_for(@person) do |f|
  = f.text_field :name
  = f.fields_for :assignment do |a|
    = a.collection_select :project_id, Project.order(:name), :id, :name
    div id="task_list"
      = render 'shared/_task_select', a: a
  = f.submit 'Save'
= a.collection_select :task_id, @tasks, :id, :name
$(document).ready(function() {
    $('#person_assignment_attributes_project_id').change(function() {
        var selection = $('#person_assignment_attributes_project_id').val();
        $.ajax({
            url: "/create_tasklist",
            data: {
                project_id : selection
            },
            dataType: "script"
        });
    });
});
$("#task_list").html("<%= escape_javascript(render 'shared/task_list', a: a) %>");
更改项目会触发javascript,该javascript在PersonsController中运行“create_tasklist”方法

new.js:

= form_for(@person) do |f|
  = f.text_field :name
  = f.fields_for :assignment do |a|
    = a.collection_select :project_id, Project.order(:name), :id, :name
    div id="task_list"
      = render 'shared/_task_select', a: a
  = f.submit 'Save'
= a.collection_select :task_id, @tasks, :id, :name
$(document).ready(function() {
    $('#person_assignment_attributes_project_id').change(function() {
        var selection = $('#person_assignment_attributes_project_id').val();
        $.ajax({
            url: "/create_tasklist",
            data: {
                project_id : selection
            },
            dataType: "script"
        });
    });
});
$("#task_list").html("<%= escape_javascript(render 'shared/task_list', a: a) %>");
“create_tasklist”(创建任务列表)方法触发一个javascript来更新部分任务:

创建\u tasklist.js.erb:

= form_for(@person) do |f|
  = f.text_field :name
  = f.fields_for :assignment do |a|
    = a.collection_select :project_id, Project.order(:name), :id, :name
    div id="task_list"
      = render 'shared/_task_select', a: a
  = f.submit 'Save'
= a.collection_select :task_id, @tasks, :id, :name
$(document).ready(function() {
    $('#person_assignment_attributes_project_id').change(function() {
        var selection = $('#person_assignment_attributes_project_id').val();
        $.ajax({
            url: "/create_tasklist",
            data: {
                project_id : selection
            },
            dataType: "script"
        });
    });
});
$("#task_list").html("<%= escape_javascript(render 'shared/task_list', a: a) %>");
然后在new.js的“data”声明中添加:
a:a
编辑2: 有了这个,FormBuilder似乎要通过“create_tasklist”方法,但我不知道如何在那里正确访问它。如果我在“create_tasklist”-方法中声明´@a=params[:a]´,然后使用(在create_tasklist.js.erb中):


因此,FormBuilder已成为一个字符串,但至少它以某种方式“通过”。如何使其保持原样?这是一种更有效的方法吗?

如何使服务器端局部变量“通过”AJAX请求保持原样的可能重复?这个问题是相关的,但没有重复:这是一种嵌套形式,其中只有一个字段应该包含在部分中。如果我使用了另一个主题中建议的解决方案,我仍然需要将FormBuilder“f”传递给partial以保持嵌套结构。那么为什么不
呢?@m_x:这会引发`语法错误,意外的'{',期望'')'。我还认为这会破坏嵌套,因为它不使用“f.fields”,而是使用“fields”.当使用“f.字段”时,“f.”将是未定义的。