Javascript Rails 4/Ruby 2:partial的局部变量(FormBuilder)通过动态更新丢失
我有一个表单,它呈现了一个用于选择一个人任务的部分 new.html.slim: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
= 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.”将是未定义的。