Ruby / Rails - Как принять nested_attributes с has_many через отношение на форме? - PullRequest
0 голосов
/ 14 февраля 2019

Я создаю веб-приложение в рельсах, и я совершенно новый с вложенными атрибутами.Я пытаюсь создать фактуру, и мне нужно одновременно регистрировать параметры Clients, Candidats и Deals.

Я нашел вложенные атрибуты как лучшее решение, но оно не работает, идентифицированное как «недопустимые параметры» (это говорит терминал).

Я строю свою модель Facture с отношениями own_to с клиентами,Кандидаты и предложения, но я решил создать промежуточную таблицу, чтобы создать has_many через связь между фактурой и другими моделями.

Но это не решает проблему.Я думаю, что что-то упустил, может быть, мне следует позвонить в удостоверение личности, но я не знаю, как это сделать

Вот мой код модели:

class Facture < ApplicationRecord
    belongs_to :delais_paiement 
    belongs_to :service 
    belongs_to :marche 
    belongs_to :team 
    belongs_to :status_facturation 
    belongs_to :condition_facturation 
    has_many :candidats, through: :informations_factures
    has_many :clients, through: :informations_factures
    has_many :deals, through: :informations_factures
    has_many :informations_factures 

    accepts_nested_attributes_for :candidats
    accepts_nested_attributes_for :informations_factures
    accepts_nested_attributes_for :clients
    accepts_nested_attributes_for :deals
end

class Deal < ApplicationRecord
    belongs_to :client
    has_many :factures, through: :informations_factures
    has_many :informations_factures

    accepts_nested_attributes_for :factures
end
class Client < ApplicationRecord
    has_many :factures, through: :informations_factures
    has_many :informations_factures
end

class Candidat < ApplicationRecord
    has_many :factures, through: :informations_factures
    has_many :informations_factures
end

class InformationsFacture < ApplicationRecord
    belongs_to :candidat
    belongs_to :client
    belongs_to :deal
    belongs_to :facture
end

Вот моя форма:

        <%= simple_form_for @facture do |f| %>

          <div class="form-group">
            <%= f.input :salaire, label: "Salaire"%>
          </div>

          <div class="form-group">
            <%= f.input :condition_facturation_id, label: "Condition de facturation",  collection: ConditionFacturation::statuses.keys %>
          </div>

          <div class="form-group">
            <%= f.input :service_id, label: "Service", collection: Service::kinds.keys%>
          </div>

          <div class="form-group">
            <%= f.input :team_id, label: "Team", collection: @team%>
          </div>

          <div class="form-group">
            <h4>Candidat</h4>
            <%= f.simple_fields_for :candidat do |af| %> 
              <%= af.input :name, label: "Name" %>
              <%= af.input :id_janus, label: 'Id Janus' %>
            <% end %>
          </div>

          <div class="form-group">
            <h4>Client</h4>
            <%= f.simple_fields_for :client do |af| %>
              <%= af.input :name, label: "Name" %>
            <% end %>
          </div>

          <div class="form-group">
            <h4>Deal infos</h4>
            <%= f.simple_fields_for :deal do |af| %>
            <%= af.input :start_date, label: "Start Date" %>
            <%= af.input :deal_date, label: "Deal Date" %>
            <% end %>
          </div>

          <%= f.submit class: 'btn btn-primary' %>
        <% end %>

Вот мой код параметров Facture Controller:

private 

def facture_params
 params.require(:facture).permit(
 :condition_facturation_id, :service_id, :team_id, 
 :salaire, {:client_id => [{:clients_attributes => [:name, :id]}]}, {:deals_attributes => [:deal_date, :start_date]}, {:candidats_attributes => [:name, :id_janus, :id]})
end

Вот мое окончательное действие:

Started POST "/factures" for 127.0.0.1 at 2019-02-14 17:14:24 +0100
Processing by FacturesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"mOmAyCZZwnG1RF7p9KSxMoNCgqxF6vVriC0YgjHAdS26pBIs73OKuhqkQurU0HVr8cotdRmUWjXFAeb+4ISjsA==", "facture"=>{"salaire"=>"1", "condition_facturation_id"=>"au_succes", "service_id"=>"recrutement",  "team_id"=>"2", "candidat"=>{"name"=>"Kévin", "id_janus"=>"#123456"}, "client"=>{"name"=>"Jean-luc"}, "deal"=>{"start_date"=>"12/28/19", "deal_date"=>"12/29/19"}}, "commit"=>"Create Facture"}
Unpermitted parameters: :candidat, :client, :deal

(0.2ms)  BEGIN
  ↳ app/controllers/factures_controller.rb:25
  Service Load (0.7ms)  SELECT  "services".* FROM "services" WHERE "services"."id" = $1 LIMIT $2  [["id", 0], ["LIMIT", 1]]
  ↳ app/controllers/factures_controller.rb:25
  Team Load (0.2ms)  SELECT  "teams".* FROM "teams" WHERE "teams"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  ↳ app/controllers/factures_controller.rb:25
  ConditionFacturation Load (0.3ms)  SELECT  "condition_facturations".* FROM "condition_facturations" WHERE "condition_facturations"."id" = $1 LIMIT $2  [["id", 0], ["LIMIT", 1]]
  ↳ app/controllers/factures_controller.rb:25
   (0.1ms)  ROLLBACK
  ↳ app/controllers/factures_controller.rb:25
  Rendering factures/new.html.erb within layouts/application
  Rendered factures/new.html.erb within layouts/application (19.7ms)

Что мне не хватает?

1 Ответ

0 голосов
/ 14 февраля 2019

Ошибка «недопустимые параметры» означает, что это проблема в контроллере, в частности в вашем коде «сильных параметров».

Я считаю, что проблема заключается в том, как вы указали разрешенные атрибуты для вложенных объектов.

Вот непроверенная версия того, как, по моему мнению, должен выглядеть ваш метод facture_params.Возможно, вам придется провести некоторое тестирование и возиться, чтобы понять это правильно.В частности, необходимость включения вложенных параметров в поля id зависит от того, хотите ли вы принимать параметры просто для создания новых объектов или для обновления существующих объектов.

def facture_params
 params.require(:facture).permit(
   :condition_facturation_id, 
   :service_id, 
   :team_id, 
   :salaire,
   :clients_attributes => [:name, :id],
   :deals_attributes => [:deal_date, :start_date],
   :candidats_attributes => [:name, :id_janus, :id]
  )
end
...