Визуализация сложной вложенной формы с предварительно заполненными значениями из AJAX в Rails 3.2 - PullRequest
2 голосов
/ 23 марта 2012

Я создаю веб-приложение, для работы которого требуется несколько сложная форма.

У меня есть пять моделей: Grid, Row, Value, VariableGroup и Variable (это не фактические имена, но полезные для справки).

A Grid имеет много rows, а Row имеет много values.Кроме того, Grid принадлежит VariableGroup, которая является своего рода моделью, которая группирует множество переменных для своих внуков.

A Variable, конечно, принадлежит VariableGroup, иключ здесь в том, что Value также принадлежит Variable.

Модели:

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 из выпадающего списка.Этот выбор имеет обработчик jQuery для .change, который должен создавать вложенную модель Row, которая, в свою очередь, создает столько Value моделей, сколько Variables существует в выбранной группе переменных Grid.

Этоформа сетки:

= 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

Блок response_to даетуправление представлением 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.

Я знаюЭто сообщение длиной в милю, поэтому заранее спасибо, если вы получили здесь.

Ответы [ 2 ]

1 голос
/ 25 апреля 2012

Рендеринг частичного из пользовательского действия контроллера вместо использования блока response_to сработал.

Мне просто пришлось жестко программировать область действия формы (чтение источника автоматически сгенерированной формы и использование ее структурыв виде строки вместе со случайным значением, и это сработало.

0 голосов
/ 23 марта 2012

Вы можете попробовать это:

respond_to do |format|
  format.js { render :partial => "rows_fields" }
end

С тем же самым для value_fields (или склеить их). Извините, если я неправильно понял ваш вопрос, хотя ... немного сонный.

...