0

我有这个表格,它呈现部分用于选择一个人的任务。

新的.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'

共享/_task_select.html.slim:

= a.collection_select :task_id, @tasks, :id, :name

更改项目会触发在 PersonsController 中运行“create_tasklist”方法的 javascript。

新的.js:

$(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"
        });
    });
});

“create_tasklist”-方法触发更新部分的 javascript:

create_tasklist.js.erb:

$("#task_list").html("<%= escape_javascript(render 'shared/task_list', a: a) %>");

现在这引发了错误:

undefined local variable or method `a' for #<#<Class:0x42cd770>:0x4213ef0>

编辑现有人员时,相同的表单效果很好 - 直到更改项目。因此,FormBuilder "a" 通过 javascript 动作失去了它的定义。我必须在这里使用部分,因为我想在稍后阶段用它做更多的事情。任何想法如何让该变量保持其定义?

编辑 1: 我已经尝试在 new.html.slim 的第三行下面添加它:

 javascript:
   var a = "#{a}";

然后a: a在 new.js 的“数据”声明中 添加:编辑 2: 有了这个,FormBuilder 似乎一直通过,直到“create_tasklist”方法,但我不知道如何在那里正确访问它。如果我在“create_tasklist”方法中声明“@a = params[:a]”,然后使用(在 create_tasklist.js.erb 中):

$("#task_list").html("<%= escape_javascript(render 'shared/task_list', a: @a) %>");

我收到错误:

 undefined method `collection_select' for "#&lt;ActionView::Helpers::FormBuilder:0x4760400&gt;":String

因此 FormBuilder 已成为一个字符串,但至少它以某种方式“通过”。我怎样才能让它完好无损,并且是实现这一目标的更有效方法?

4

0 回答 0