У меня есть приложение с моделями, которые мы будем называть 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>
Любая помощь очень ценится! Я пробовал несколько разных подходов к этой проблеме, но все еще не смог заполнить вложенные поля. Благодаря!
Вы подтвердили: а) что 'PARAMS [: box_id]' там на самом деле? б) что в «запасах» и в) есть что-то полезное для «samples_attributes»? Тогда d) что '@ experiment.samples' фактически содержит что-нибудь? т.е. ... в какой момент заселение не удается? :) –
Да, 'params [: box_id]' передается, «акции» равны коллекции ActiveRecord объектов «Stock», «samples_attributes» - это массив объектов (samples_attributes.first = {: stock_id => 1}) , а '@ experiment.samples' представляет собой коллекцию несохраненных объектов ActiveRecord. Я действительно смог решить проблему здесь - «f.object.samples.order (: id)» не работал, но «@ experiment.samples» работает. Благодаря! – Ronu