Unpermitted parameter, nested forms

0

I'm trying to make a nested form. The situation is that I want to create events and relate them to a company, this from the event form, I already show the existing companies but at the time of saving, I get an error in the console

  

Unpermitted parameter: companies

While in the view it shows me

  

1 error prohibited this event from being saved:   Company must exist

My code is as follows:

events_controller.rb

def new
    @event = Event.new
    @event.build_company
  end

  # POST /events
  # POST /events.json
  def create
    @event = Event.new(event_params)


    respond_to do |format|
      if @event.save
        format.html { redirect_to @event, notice: 'Event was successfully created.' }
        format.json { render :show, status: :created, location: @event }
      else
        format.html { render :new }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end

....
private
    # Use callbacks to share common setup or constraints between actions.
    def set_event
      @event = Event.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def event_params
      params.require(:event).permit(:eve_descripcion, :eve_fecha, :eve_horaInicio, :eve_horaFin, :eve_recordatorio, :eve_observacion, companies_attributes:[:id])
    end

_form.html.erb (update)

    <%= form_with(model: event, local: true) do |form| %>
  <% if event.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(event.errors.count, "error") %> prohibited this event from being saved:</h2>

      <ul>
      <% event.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <div class="row">
    <div class="col-10 offset-1">

      <%= form.fields_for :type_events do |type_events| %>
      <div class="form-group">
        <%= type_events.label :emp_nombre, "Tipo de evento" %>
        <%= type_events.collection_select(:type_event_id, TypeEvent.all, :id, :nombre, prompt: 'Selecciona un tipo de evento', class: "form-control") %>

      </div>
      <%end%>

      <%= form.fields_for :companies do |companies| %>
      <div class="form-group">
        <%= companies.label :emp_nombre, "Empresa" %>
        <%= companies.collection_select(:company_id, Company.all, :id, :emp_nombre, prompt: 'Selecciona una compañia', class: "form-control") %>

      </div>
      <%end%>


      <div class="form-group">
        <%= form.label :eve_descripcion, "Descripción" %>
        <%= form.text_area :eve_descripcion, id: :event_eve_descripcion, class: "form-control", placeholder: "Temas a tratar en este evento" %>
      </div>


        <div class="form-group">
          <%= form.label :eve_fecha, "Fecha del evento" %>
          <%= form.date_select :eve_fecha, id: :event_eve_fecha, class: "form-control" %>
        </div>
      <div class="form-row">
        <div class="form-group col-aut pr-4">
          <%= form.label :eve_horaInici, "Hora de inicio" %>
          <%= form.time_select :eve_horaInicio, id: :event_eve_horaInicio, class: "form-control" %>
        </div>

        <div class="form-group col-auto">
          <%= form.label :eve_horaFin, "Hora de finalización" %>
          <%= form.time_select :eve_horaFin, id: :event_eve_horaFin, class: "form-control" %>
        </div>
      </div>

      <div class="form-group">
        <%= form.label :eve_recordatorio, "Recordatorio" %>
        <%= form.datetime_select :eve_recordatorio, id: :event_eve_recordatorio, class: "form-control" %>
      </div>

      <div class="form-group">
        <%= form.label :eve_observacion, "Observaciones" %>
        <%= form.text_area :eve_observacion, id: :event_eve_observacion, class: "form-control", placeholder: "Conclusiones" %>
      </div>


    <div class="actions">
      <%= form.submit %>
    </div>  
    </div>
  </div>

<% end %>

company.rb

class Company < ApplicationRecord
    has_many :events, dependent: :destroy

    validates :emp_nombre, presence:true
end

event.rb

class Event < ApplicationRecord
    belongs_to :company
    accepts_nested_attributes_for :company, reject_if: proc { |attributes| attributes['id'].blank? }

end

Thank you in advance

    
asked by Arturo Sustaita Castro 28.02.2018 в 18:12
source

1 answer

0

Since you are only creating events with existing companies (ie the one that the user chooses through companies.collection_select in the form), you do not need to use accepts_nested_attributes_for (since this is to create and / or edit the related object).

Considering the above, you could simplify your code by removing accepts_nested_attributes_for :

# event.rb

class Event < ApplicationRecord
  belongs_to :company
end

And adding the id of the company in event_params :

# events_controller.rb

def event_params
  params.require(:event).permit(:eve_descripcion, :eve_fecha, :eve_horaInicio, :eve_horaFin, :eve_recordatorio, :eve_observacion, :company_id)
end

It is also necessary to eliminate form.fields_for so that the attribute company_id is within the group event and so it can be recognized within params.require(:event) , for example:

<!-- _form.html.erb -->

<%= form_with(model: event, local: true) do |form| %>
  <!-- ... código de forma -->

  <%= form.label :company_id, "Empresa" %>
  <%= form.collection_select(:company_id, Company.all, :id, :emp_nombre, prompt: 'Selecciona una compañia') %>

 <!-- ... más código de forma -->
<% end %>
    
answered by 28.02.2018 / 23:07
source