Saving _form along with has_many through items
Hi Chris,
I'm having difficulty wrapping my head around how to save a form (Kit) that includes optional items for a has_many through relationship (AmazonProductKit). Here are my models:
class Kit < ActiveRecord::Base
has_many :amazon_product_kits
has_many :amazon_products, through: :amazon_product_kits
end
class AmazonProduct < ActiveRecord::Base
has_many :amazon_product_kits
has_many :kits, through: :amazon_product_kits
end
class AmazonProductKit < ActiveRecord::Base
belongs_to :kit
belongs_to :amazon_product
validates :quantity, presence: true
end
What I'd like to do with the Kits#_form is capture a couple Kit attributes (title, persons, and description) and then also allow the user to pick any AmazonProduct objects they'd like included in that Kit (this is how the form functions now, however, when I save it there are no AmazonProductKit objects being stored). I'd also like to have the ability to capture the quantity for each checked AmazonProductKit in a dropdown menu, but I haven't figured out how go about doing that.
So, I know I need to modify my controller and _form, I'm just not sure what exactly. Here's my kits_controller.rb:
class KitsController < ApplicationController
before_action :set_kit, only: [:show]
def index
@kits = Kit.all
end
def show
end
def new
@kit = Kit.new
end
def create
@kit = Kit.create(kit_params)
if @kit.save
flash[:success] = "Kit has been created."
redirect_to kit_path(@kit)
else
flash[:alert] = "Kit has not been created."
render "new"
end
end
private
def set_kit
@kit = Kit.find(params[:id])
end
def kit_params
params.require(:kit).permit(:title, :persons, :description, :amazon_product_kits => [])
end
end
And here's my kit _form.html.erb:
<%= form_for(@kit) do |f| %>
<% if @kit.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@kit.errors.count, "error") %> prohibited this kit from being saved:</h2>
<ul>
<% @kit.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field form-group">
<%= f.label :title %><br>
<%= f.text_field :title, required: true, autofocus: true, placeholder: "e.g. 72-hour Emergency Kit", class: "form-control" %>
</div>
<div class="field form-group">
<%= f.label :persons %><br>
<%= f.text_field :persons, autofocus: true, placeholder: "e.g. 1", class: "form-control" %>
</div>
<div class="field form-group">
<%= f.label :description %><br>
<%= f.text_area :description, rows: 10, autofocus: true, placeholder: "e.g. http://www.monkeysee.com/play/28716-orlando-s-newest-tourist-destination", class: "form-control" %>
</div>
<div class="field form-group">
<%= collection_check_boxes(:kit, :amazon_product_kit_ids, AmazonProduct.all, :id, :title) do |b| %>
<%= b.check_box %>
<%= b.label %>
<br>
<!-- capture `quantity` of this AmazonProduct if checked -->
<% end %>
</div>
<div class="actions form-group">
<%= f.submit "Save Kit", class: "submit-button btn btn-default" %>
</div>
<% end %>
Let me know if you think I should alter how I've constructed my model relationships or if I should consider tweaking how a new Kit is captured. Thanks in advance!