2017-01-23 14 views
0

У меня есть приложение с моделями, которые мы будем называть Box, Stock, Experiment, & Образец. Вот то, что отношения ActiveRecord выглядеть следующим образом:Prepopulate вложенные поля, используя Cocoon gem

class Box 
    has_many :stocks 
    accepts_nested_attributes_for :stocks 
end 

class Stock 
    belongs_to :box 
    has_many :samples 
end 

class Experiment 
    has_many :samples 
    accepts_nested_attributes_for :samples 
end 

class Sample 
    belongs_to :experiment 
    belongs_to :stock 
end 

Я хотел бы иметь кнопку на моей коробке # шоу странице под названием «Создать эксперимент из коробки». В идеале это приведет меня к моей новой странице «Эксперимент» с предварительно заполненными вложенными полями для образцов - по одному образцу на акцию. Образцы еще не должны быть сохранены, так как я хочу, чтобы пользователь мог модифицировать образцы перед сохранением эксперимента. Однако в настоящее время я не могу получить вложенные поля в preopulate.

приложение/просмотров/коробки/show.html.erb

<%= link_to 'Generate New Experiment Box', new_experiment_path(box_id: @box.id) %> 

приложение/контроллеры/эксперименты/experiments_controller.rb

def new 
    if params[:box_id] 
    stocks = Box.find(params[:box_id]).stocks 
    samples_attributes = stocks.map { |stock| { stock_id: stock.id } } 
    @experiment = Experiment.new(samples_attributes: samples_attributes) 
    else 
    @experiment = Experiment.new 
    end 
end 

приложение/просмотров/эксперименты/new.html.erb

<%= simple_form_for(@experiment) do |f| %> 
    <div> 
    #various form inputs 
    </div> 

    <div> 
    <table> 
     <thead>#column headers</thead> 
     <tbody id="samples-table"> 
     <%= f.simple_fields_for :samples, f.object.samples.order(:id) do |sample_fields| %> 
      <%= render 'sample_fields', f: sample_fields %> 
     <% end %>   
     </tbody> 
    </table> 
    <div id="Links"> 
     <%= link_to_add_association "Add Samples to Experiment", f, :samples, :"data-association-insertion-node" => 'tbody#samples-table', :"data-association-insertion-method" => 'append' %>   
    </div> 
    </div> 
<% end %> 

приложение/просмотров/эксперименты/_sample_fields.html.erb

<tr class="nested-fields form-inline form-table-row"> 
    <td>#various text fields</td> 
    <td>#various text fields</td> 
</tr> 

Любая помощь очень ценится! Я пробовал несколько разных подходов к этой проблеме, но все еще не смог заполнить вложенные поля. Благодаря!

+1

Вы подтвердили: а) что 'PARAMS [: box_id]' там на самом деле? б) что в «запасах» и в) есть что-то полезное для «samples_attributes»? Тогда d) что '@ experiment.samples' фактически содержит что-нибудь? т.е. ... в какой момент заселение не удается? :) –

+1

Да, 'params [: box_id]' передается, «акции» равны коллекции ActiveRecord объектов «Stock», «samples_attributes» - это массив объектов (samples_attributes.first = {: stock_id => 1}) , а '@ experiment.samples' представляет собой коллекцию несохраненных объектов ActiveRecord. Я действительно смог решить проблему здесь - «f.object.samples.order (: id)» не работал, но «@ experiment.samples» работает. Благодаря! – Ronu

ответ

0

Если я правильно понял, если у вас есть поле с запасами, вы хотите создать новый эксперимент с образцом для каждого запаса из этого окна.

В вашем new действия попробуйте следующее:

def new 
    @experiment = Experiment.new 
    if params[:box_id] 
    box = Box.find(params[:box_id]) 
    box.stocks.each do |stock| 
     @expirement.samples.build(stock_id: stock.id) 
    end 
    end 
end