Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails grouped_collection_select not working when saving

I'm using grouped_collection_select in filtering out associated information in a rails 5 form.

The first grouped_collection_select works with the Property filtering out associated data relevant to Co-operators. But, the second grouped_collection_select does work when filtering Fields associated to a Property, but comes up with an error when trying to save:

1 error prohibited this trial from being saved:

Field must exist

Form

<%= form_with(model: trial, local: true) do |f| %>
 <label>Co-operator</label>
 <%= f.collection_select :cooperator_id, Cooperator.order('last_name'), :id, :full_name %>
 <label>Property</label>
 <%= f.grouped_collection_select :property_id, Cooperator.order('last_name'), :properties, :full_name, :cooperator_id, :name %>
 <label>Field</label>
 <%= f.grouped_collection_select :field_id, Property.order('name'), :fields, :name, :property_id, :field_name %>
 <%= f.submit 'Submit' %>
<% end %>

When I change the grouped_collection_select to a collection_select it works as should. But, this does't suit what i'm needing.

<%= f.collection_select :field_id, Field.all, :id, :field_name %>

Trials Controller

def trial_params
 params.require(:trial).permit(:cooperator_id, :field_id, :property_id)
end

Trial Model

class Trial < ApplicationRecord
  belongs_to :cooperator
  belongs_to :property
  belongs_to :field
end

Log

Processing by TrialsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"THfy+JGBYbNvzurUscPfP8LQbnnvIz1HBEfeFRiZrocXtiu4ayncEA8cNBA2IkPgcphLoa0QWsEueFBEP29OXA==", "trial"=>{"cooperator_id"=>"2", "property_id"=>"2", "field_id"=>""}, "commit"=>"Create trial", "id"=>"11"}
Cooperator Load (0.5ms)  SELECT  "cooperators".* FROM "cooperators" WHERE "cooperators"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  ↳ app/controllers/trials_controller.rb:49
  Property Load (0.4ms)  SELECT  "properties".* FROM "properties" WHERE "properties"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  ↳ app/controllers/trials_controller.rb:49
Field Load (0.4ms)  SELECT "fields".* FROM "fields"
  ↳ app/views/trials/_form.html.erb:39
Rendered trials/_form.html.erb (15.3ms)
  Rendered trials/edit.html.erb within layouts/application (16.6ms)
  Rendered partials/_top_nav.html.erb (0.5ms)
  Rendered partials/_main_nav.html.erb (0.8ms)
Completed 200 OK in 63ms (Views: 46.9ms | ActiveRecord: 8.2ms)
like image 595
DollarChills Avatar asked Sep 28 '18 06:09

DollarChills


1 Answers

The form code doesn't look right to me, the first grouped collection should be something like:

<%= f.grouped_collection_select :property_id, Cooperator.order('last_name'), :properties, :full_name, :id, :name %> # Notice that the cooperator_id is replaced with id because this needs to be the value that should be set on selection. Your original code would set it to the ID of the Cooperator instead of Property.

Similarly, the second one should be something like:

<%= f.grouped_collection_select :field_id, Property.order('name'), :fields, :name, :id, :field_name %>

like image 139
Chirag Avatar answered Nov 14 '22 23:11

Chirag