dimanche 7 novembre 2021

Rails 5: Is Nested forms set up correct

If I want a Nested Form for volunteer_shift inside my assignment/_form

How should my model associations be set up?

My current associations look like this..but I am not sure they are correct if the volunteer_shift partial sits inside the assignment form....

When I try to open the "add new record" form...my assignment#new action errors out...

error message

Completed 500 Internal Server Error in 30ms (ActiveRecord: 2.7ms)



NoMethodError - undefined method `build' for nil:NilClass:
  app/controllers/assignments_controller.rb:21:in `new'

Here is my new action...

  # GET /assignments/new
  def new
    @assignment = Assignment.new
    # binding.pry
    @assignment.volunteer_event.build   <----Line 21
    @my_url = {:action => "create", :id => params[:id]}
  end

Here are my current models associations...

class Assignment < ApplicationRecord
  attr_accessor :volunteer_event
  belongs_to :volunteer_shift
  has_one :volunteer_task_type, :through => :volunteer_shift, :source => :volunteer_task_type
  belongs_to :contact ,optional: true
  validates_presence_of :volunteer_shift #belongs_to takes care of this now
  validates_associated :volunteer_shift
  accepts_nested_attributes_for :volunteer_shift, allow_destroy: true
...
class VolunteerShift < ApplicationRecord
  has_many :assignments
  belongs_to :volunteer_event
...

class VolunteerEvent < ApplicationRecord
  belongs_to :volunteer_default_event
  has_many :volunteer_shifts, :dependent => :destroy
  has_many :resources_volunteer_events, :dependent => :destroy
  validates_associated :volunteer_shifts

And inside my assignment/form

<%= form_for @assignment, :url => @my_url, remote: true do |f| %>
...
          <!--VOLUNTEER SHIFT-->
          <!--TODO: make this a partial under field_for-->
          <%= f.fields_for :volunteer_shift do |builder| %>
            <%= render 'volunteer_shift_fields', vs: builder %>
          <% end %>
...
<% end %>

and if you want to see the volunteer_shift_fields partial


<div class="name large flex-row">
  <%= vs.label :volunteer_shift %>
</div>
<div id="volunteer_shift" class="d-flex flex-row">
  <div class="col-sm-12 p-2">
    <div id="volunteer_shift" class="text-right">
      <!-- old if: if class is assignment show volunteer shift else show default shift -->
      <!--  we need default shift here...NO assignment is attached-->
      <div class="field">
        <%= vs.label :volunteer_task_type_id %>
        <%= select_tag 'volunteer_task_type_id', options_from_collection_for_select([VolunteerTaskType.new(:description => ""),  VolunteerTaskType.instantiables.effective_on(Date.today)].flatten, "id", "description")  %>
      </div>
      <div class="field">
        <%= vs.label :roster_id %>
        <%= select_tag 'roster_id', options_from_collection_for_select([Roster.new(:name => ""), Roster.all].flatten, "id", "name") %>
      </div>
      <div class="field">
        <%= vs.label :program_id %>
        <%= select_tag 'program_id', options_from_collection_for_select([Program.new(:name => ""), Program.where(:volunteer => true)].flatten, "id", "name")%>
      </div>
      <div class="field">
        <%= vs.label :set_description %>
        <%= vs.text_field(:set_description, nil) %>
      </div>
      <div class="field">
        <%= vs.label :set_date, "Date" %> <
        <%= vs.text_field(:set_date, nil) %>
      </div>
    </div>
  </div>
</div>

Are my model associations correct? What is my "assignment#new" action missing?

Aucun commentaire:

Enregistrer un commentaire