0
I have the following problem in a form using has_many through.
I have a register where I created dynamic forms. These dynamic forms are inserted in another screen.
I’m having difficulty in the controller where I insert these pictures and the view I insert.
Appointments -> where I can have a lot of dynamic formulas (record_forms) Record_forms -> dynamic forms registration Record_form_fields -> dynamic form fields Appointment_record_forms -> Relationship table between Appointments and Record_forms
Schema
create_table "appointment_record_forms", force: :cascade do |t|
t.integer "appointment_id", limit: 4
t.integer "record_form_id", limit: 4
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.text "properties", limit: 65535
end
create_table "appointments", force: :cascade do |t|
t.string "duration", limit: 255
t.date "appointment_date"
t.integer "patient_id", limit: 4
t.integer "doctor_id", limit: 4
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "record_form_fields", force: :cascade do |t|
t.string "name", limit: 255
t.string "field_type", limit: 255
t.boolean "required"
t.integer "record_form_id", limit: 4
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "record_forms", force: :cascade do |t|
t.string "name", limit: 255
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
Models
class Appointment < ActiveRecord::Base
belongs_to :patient
belongs_to :doctor
has_many :appointment_record_forms, dependent: :destroy
has_many :record_forms, through: :appointment_record_forms
has_many :record_form_fields
accepts_nested_attributes_for :appointment_record_forms, allow_destroy: true
end
class AppointmentRecordForm < ActiveRecord::Base
belongs_to :appointment
belongs_to :record_form
serialize :properties, Hash
def validate_properties
record_form.record_form_fields.each do |record_form_field|
if record_form_field.required? && properties[record_form_field.name].blank?
errors.add record_form_field.name, "must not be blank"
end
end
end
end
class RecordForm < ActiveRecord::Base
has_many :record_form_fields
has_many :appointment_record_forms, dependent: :destroy
has_many :appointments, through: :appointment_record_forms
accepts_nested_attributes_for :record_form_fields, allow_destroy: true
end
class RecordFormField < ActiveRecord::Base
belongs_to :record_form
end
**Controller**
class AppointmentsController < ApplicationController
.
.
.
def appointment_params
params.require(:appointment).permit(:duration, :appointment_date, :patient_id, :doctor_id,
:record_form_ids, :appointment_form_ids
)
end
end
View
Appointments/_form.html.erb
<!-- onde escolho um formulario dinamico e clico para inseri-lo -->
...
<%= f.fields_for :appointment_record_forms do |builder| %>
<%= f.select_tag :record_form_id, options_from_collection_for_select(RecordForm.all, :id, :name) %>
<%= render 'appointment_record_form_fields', f: builder %>
<% end %>
<%= link_to_add_fields "Add Field", f, :appointment_record_forms %>
....
Partial
Appointments/_appointment_record_form_fields.html.br
<!-- Aqui é onde eu carrego os campos do formulario dinamico e salvo e busco os valores desses campos atraves do hash 'properties' -->
<fieldset>
<%= f.fields_for :properties, OpenStruct.new(@appointment_record_forms.properties) do |builder| %>
<% @appointment_record_forms.record_form.record_form_fields.each do |record_form_field| %>
<%= render "appointments/fields/#{record_form_field.field_type}", record_form_field: record_form_field, f: builder %>
<% end %>
<% end %>
<%= f.hidden_field :_destroy %>
<%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>
Currently running the application this with the error:
undefined method `properties' for :appointment_record_forms:Symbol
I would like to know how I should do in the appointment controller to receive the association, in the view to insert the dynamic form and Partial to list save the record in the hash and show the form fields correctly.
From now on I appreciate if anyone can help.