我有这个表格,它呈现部分用于选择一个人的任务。
新的.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 "#<ActionView::Helpers::FormBuilder:0x4760400>":String
因此 FormBuilder 已成为一个字符串,但至少它以某种方式“通过”。我怎样才能让它完好无损,并且是实现这一目标的更有效方法?