2014-01-23 3 views
2

Мне нужна ваша помощь с пользовательской формой для нового объекта в activeadmin - rails. Мое текущее решение выглядит так. enter image description hereRails - ActiveAdmin - отображение пользовательской формы has_many как таблица

Вложенный атрибут «Belegung» является has_many ассоциации: Это как моя форма выглядит

form do |f| 
f.inputs "Hardware Details" do 
    f.input :serial_nr, :label => "Seriennummer:" 
    f.input :name, :label => "Name:" 
    f.input :hardware_type, :label => "Typ:" 
    f.input :location_id, :label => "Standort", as: :select, collection: Location.where(client_id: current_user.client_id) 
    f.input :hardware_spec_id, :label => "Hardware-Spezifikation", as: :select, collection: HardwareSpec.all.map{ |h| [h.hardware_type, h.id] } 
end 
f.inputs "Belegung:" do # Makes a panel that holds inputs for a location id 
    f.has_many :assignments, :heading => false do |cf| 
    cf.input :row, :label => "Reihe:" 
    cf.input :column, :label => "Spalte:" 
    cf.input :product_id, :label => "Produkt", as: :select, collection: Product.where(client_id: current_user.client_id) 
    end 
end 
f.actions 

конец

Я хотел бы создать таблицу с фиксированным числом строк и столбцов , Внутри каждой ячейки я хотел бы иметь что-то вроде:

for 1.. 10 do 
    tr 
     for 1..3 
     cf.input :row = "current_row" 
     cf.input :column = "current_column" 
     cf.input :product_id ..... 

Надеюсь, вы сможете помочь. Спасибо.

EDIT:

Хорошо, I`ve играл с некоторыми Jquery код/​​Haml и теперь, мой текущий результат выглядит следующим образом.

enter image description here

Мой пользовательский файл вид "html.haml" выглядит следующим образом

= semantic_form_for [:admin, @hardware], :builder => ActiveAdmin::FormBuilder do |f| 


- f.inputs "Hardware" do 
    - f.input :name 
    - f.input :serial_nr 
    - f.input :hardware_type, :label => "Typ:" 
    - f.input :location_id, :label => "Standort", as: :select, collection: Location.where(client_id: current_user.client_id) 
    - f.input :hardware_spec_id, :label => "Hardware-Spezifikation", as: :select, collection: HardwareSpec.all.map{ |h| [h.hardware_type, h.id] } 
    - f.inputs "Belegung" do 
    #assignments 
    = f.actions 

:javascript 



    $('#hardware_hardware_spec_id').change(function(){ 
      //clear conent 
      $('#assignments').empty(); 
      var id = $('#hardware_hardware_spec_id').val(); 
      if(id != "" 

){ 
     var root = window.location.protocol + '//' + window.location.host; 

    var spec_url = root+"/admin/hardware_specs/"+id; 
    $.ajax({ 
     dataType: "json", 
     type: "get", 
     url: spec_url, 
     timeout: 5000 
    }).done(function(response){ 
     var rows = response.hardware_spec.rows; 
     var columns = response.hardware_spec.columns; 

     var table = $('<table></table>').addClass('foo'); 
     //Überschriften 
     var title = $('<tr></tr>') 
     var title2 = $('<th></th>'); 
     title.append(title2); 
     for (i = 0; i < columns; i++) { 
      var title1 = $('<th></th>').text('Spalte ' + i); 
      table.append(title); 
      title.append(title1); 
     } 
     for (j = 0; j < rows; j++) { 
       var row_header = $('<th></th>').text('Reihe ' + j); 
       row = $('<tr></tr>'); 
       row.append(row_header); 
       for (i = 0; i < columns; i++) { 
        var input = $('<select></select>'); 
        if(input.prop) { 
         var options = input.prop('options'); 
        } 
        else { 
         var options = input.attr('options'); 
        } 

        var products = #{Product.where(client_id: current_user.client_id).to_json.html_safe}; 
        $.each(products, function(id, product){ 
         options[options.length] = new Option(product.description, id); 
        }); 
        var row1 = $('<td></td>'); 
        row1.append(input) 
        row.append(row1); 
        table.append(row); 

       } 
     } 

     if ($('table').length) { 
      $("#assignments tr:first").after(row); 
     } 
     else { 
      $('#assignments').append(table); 
     } 
    }); 
    } 

});

Последнее, что мне нужно сделать, это создать модель («оборудование») с вложенными атрибутами («serial_nr», «name», assignments => [row, column, product_id] »), как в приведенной выше форме. Thx

+0

Я не понимаю - что вам нужно делать? – seanlinsley

+0

Моя модель «Оборудование» имеет отношение «has_many» к «Assignments» (Belegung), а «assignments» имеет отношение «принадлежит» к «Продукту». Моя проблема заключается в том, что мой объект «Оборудование» может иметь отношение до 100 «Назначение» -Объекты. Вместо 100 строк 'Assignment', я бы хотел отобразить таблицу со 100 ячейками. Внутри каждой ячейки я могу отредактировать отношение «принадлежит к продукту» объекта назначения. –

ответ

3

Ok Теперь я установил мою проблему, выполнив следующие действия:

  1. оказывает частичная

    ActiveAdmin.register Модели сделать

    вида: частичный => 'customform'

  2. В «/ app/views/admin/model /» создайте файл «_customform.html.haml»

  3. В вашем файле Haml вы можете комбинировать html-теги с haml-кодом. Таким образом, если у вас есть проблемы с использованием отношения has_many в formtastic-formbuilder, вы можете создавать теги HTML-ввода со следующими типами «id» и «name».

Например:

= semantic_form_for [:admin, @parent], :builder => ActiveAdmin::FormBuilder do |f| 


- f.inputs "Parent" do 
    - f.input :name, :required => true 
    - f.input :serial_nr, :required => true 
    - f.input :location_id, :required => true, :label => "Standort", as: :select, collection: Location.where(client_id: current_user.client_id) 
    - (0..5).each do |row| 
     %input{:id=>"parent_childrens_attributes_#{row}_attribute", :name=>"parent[childrens_attributes][#{row}][attribute]"} 

Хитрость заключается в "ID" и название "определение" во входном теге. Теперь вы можете легко создавать пользовательские представления и комбинировать formtastic и html/haml-код.

Или вы можете передать другие объекты модели. Вам просто нужно перезаписать «новые» другие «редактируемые» функции в админ-контроллере.

def new 
    @example = Example.where(..) 
    new! 
end 

в форме:

@example.each do |row| 
    %input{:id=>"parent_childrens_attributes_#{row}_attribute", :name=>"parent[childrens_attributes][#{row}][attribute]"} 

Надеется, что это может помочь другим создавать различные пользовательские формы в activeadmin.

Смежные вопросы