Вложенные атрибуты имеют много через

У меня есть 3 модели:

class Day < ApplicationRecord
  belongs_to :goal
  has_many :day_salesmen, dependent: :destroy
  has_many :salesmen, through: :day_salesman
  validates_presence_of :date_day, :goal_id

  accepts_nested_attributes_for :day_salesmen
end

class DaySalesman < ApplicationRecord
  belongs_to :day
  belongs_to :salesman

  accepts_nested_attributes_for :salesman

end

class Salesman < ApplicationRecord
  belongs_to :company
  has_many :goal_salesmen, dependent: :destroy
  has_many :goals, through: :goal_salesmen

  has_many :day_salesmen, dependent: :destroy
  has_many :days, through: :day_salesmen

end

Я хочу при редактировании Дней добавить продавцов в мою таблицу и связать дни и продавцов через таблицу day_salesman. Я пытаюсь сделать это, но я не понимаю, я отправляю свои контроллеры и мои взгляды:

   class DaysController < ApplicationController
  before_action :find_day, only: [:show, :edit, :update]

  def index
    @day = current_owner.companies.find(params[:company_id]).goal.find(params[:goal_id]).days
  end

  def show
  end

  def edit
    @dayup = Day.new
    @day_salesmen = @dayup.day_salesmen.build
    @salesman = @day_salesmen.build_salesman
  end

  def update
    if @day.update(params_day)
      flash[:notice] = "Day updated!"
      redirect_to company_salesman_path(:id => @day.id)
    else
      flash.now[:error] = "Could not update day!"
      render :edit
    end
  end

  private

  def find_day
    @day = Day.find(params[:id])
  end

  def params_day
    params.require(:day).permit(:value, day_salesman_attributes: [:id, salesman_attributes:[:name]]).merge(goal_id: params[:goal_id])
  end
end

Контроллер продавца:

class SalesmenController < ApplicationController
  before_action :find_salesman, only: [:edit, :update, :destroy, :show]

  def index
    @salesman = current_owner.companies.find(params[:company_id]).salesman
  end

  def new

  end

  def show

  end

  def create
    @salesman = Salesman.new(params_salesman)
    if @salesman.save
      flash[:notice] = "Salesman saved!"
    else
      flash.now[:error] = "Cannot create salesman!"
      render :new
    end
  end

  def edit
  end

  def update
    if @salesman.update(params_salesman)
      flash[:notice] = "salesman updated!"
    else
      flash.now[:error] = "Could not update salesman!"
      render :edit
    end
  end

  def destroy
    @salesman.destroy
  end

  private

  def find_salesman
    @salesman = Salesman.find(params[:id])
  end

  def params_salesman
    params.require(:salesman).permit(:name).merge(company_id: params[:company_id])
  end
end

Дни редактирования вид:

 <%= form_for(@dayup, url: company_salesmen_path) do |f| %>
  <%= f.label :value_of_day %>
  <%= f.number_field :value %>
  <%= f.fields_for :day_salesman do |ff| %>
    <%= f.fields_for :salesman do |fff| %>
      <%= fff.label :names_of_salesmen %>
      <%= fff.text_field :name %>
    <% end %>
  <% end %>
  <%= f.submit "Create" %>
<% end %>

Когда я заполняю форму редактирования, она выдает следующую ошибку:

Журнал ошибок:

Started POST "/companies/3/salesmen" for 172.24.0.1 at 2017-10-31 11:51:47 +0000
Cannot render console from 172.24.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by SalesmenController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"xQgslyRRkHIEab/E+vEQDYJhxg28IoBNNqV7N8fJxT5oI68Tm4xHrPqjDLNX1aUb8kUVVNceaA0rtfRGzlUskQ==", "day"=>{"value"=>"500", "salesman"=>{"name"=>"Denis"}}, "commit"=>"Create", "company_id"=>"3"}
  [1m[36mOwner Load (0.5ms)[0m  [1m[34mSELECT  "owners".* FROM "owners" WHERE "owners"."id" = $1 ORDER BY "owners"."id" ASC LIMIT $2[0m  [["id", 1], ["LIMIT", 1]]
Completed 400 Bad Request in 28ms (ActiveRecord: 0.5ms)

Я не знаю, правильно ли я делаю, вероятно, нет, вспоминая, что я хочу добавить продавца, когда я редактирую день, а не когда я создаю день, я не знаю, возможно ли это. Кто-нибудь может помочь?

1 ответ

Обычно в этом случае я проверяю журналы своего сервера на наличие предупреждений или ошибок.

Логика такова:

  1. объект создан

    @day = Day.new input_params
    
  2. объект проверяется перед сохранением

    @day.valid?
    
  3. объект сохранен

    @day.save
    

если объект не сохранен, это потому что:

у вас есть проблемы с вашими параметрами

@day = Day.new input_params

Так что ваши input_params что-то не хватает или они имеют неправильный формат, проверьте эти params остановив перед сохранением кода с binding.pry и сравнить значение params с input_params

это пример того, как input_params с вложенной формой должны быть переданы

{
  'person' => {
    'name' => 'John Doe',
    'addresses_attributes' => {
      '0' => {
        'kind' => 'Home',
        'street' => '221b Baker Street'
      },
      '1' => {
        'kind' => 'Office',
        'street' => '31 Spooner Street'
      }
    }
  }
}

вы упускаете объект

например, вы сохраняете объект, который имеет belongs_to отношения с другим объектом, но этот объект не существует... это случаи

какая-то другая причина не так сложно выяснить

Другие вопросы по тегам