我正在构建一个web应用程序,它需要一个稍微复杂的表单才能运行。
我有五种型号:Grid
、Row
、Value
、VariableGroup
和Variable
(这些不是实际的名称,但可供参考)。
AGrid
有多个rows
,ARow
有多个values
此外,aGrid
属于aVariableGroup
,它是一种为其孙子孙女分组许多变量的模型。
当然,AVariable
属于AVariableGroup
,这里的关键是AValue
也属于AVariable
。
模型:
class Grid < ActiveRecord::Base
belongs_to :variable_group
has_many :rows
accepts_nested_attributes_for :rows, :allow_destroy => true
end
class Row < ActiveRecord::Base
belongs_to :grid
has_many :values
accepts_nested_attributes_for :values, :allow_destroy => true
end
class Value < ActiveRecord::Base
belongs_to :variable
belongs_to :row
end
class Variable < ActiveRecord::Base
belongs_to :variable_group
end
class VariableGroup < ActiveRecord::Base
has_many :variables
has_many :grids
end
创建新网格的预期行为如下:
用户必须从下拉选择中选择
VariableGroup
。该选择有一个用于“cc>”的jQuery处理程序,它必须实例化嵌套的.change
模型,它在网格的选定变量组中实例化多达Row
> Value
。这是网格表单:
= simple_form_for @grid, :html => {:class => 'form-horizontal' } do |f|
= f.input :name
= f.association :variable_group_id
.rows_and_values_container
= f.simple_fields_for :rows do |p|
= render 'rows_fields', :f => p
= f.submit
这是附加的侦听器:
$('document').ready(function(){
$('#grid_variable_group_id').change(function(){
$.ajax({url: '/grids/load_variables_in_values',
data: 'selected=' + this.value,
dataType: 'script'})
});
});
这是load_variables_in_values操作:
def load_variables_in_values
@grid = Grid.new
row = @grid.rows.build
@variables = Variable.where(:variable_group_id => params["selected"])
@variables.each do |variable|
value = row.values.build
value.variable_id = variable.id
end
# render :partial => "test_data_sets_fields"
respond_to do |format|
format.js
end
end
respond_to block将控件生成一个js.erb视图,该视图应加载以下部分,但由于我不知道在何处以及如何处理部分及其子部分的加载,所以我被困在这里:
#rows_fields partial
= f.input :name
= f.input :grid_id #Should be hidden
= f.simple_fields_for :test_data_values do |p|
= render 'values_fields', :f => p
#values_fields partial
= f.input :value
= f.input :row_id #Should be hidden
= f.input :variable_id #Auto-assigned
我想我有80%的支持率,但是我不知道如何用我在通过ajax调用的自定义控制器操作中处理的数据加载带有相应值的部分。
我知道这是一英里长的邮递员,所以如果你来了,请提前谢谢。
最佳答案
从自定义控制器操作呈现部分,而不是使用响应块工作。
我只需要硬编码表单的作用域(读取自动生成表单的源代码,并将其结构用作字符串和随机值,它就可以工作了。