У нас есть код Rails 5.2, который имеет такую структуру: Договор -> Клиент -> Договор по счету имеет клиента Клиент имеет договор по счету клиента с учетной записью клиента.
Когда мы сохраняем в Контроллере контракта, мыget и ошибка, запрашивающая идентификатор контракта в модели учетной записи.
Все формы используют вложенные во вложенные, вложенные атрибуты в порядке.
/ contratos_controller.rb
class ContratosController < ApplicationController
layout "contratouxs"
def new
@contrato = Contrato.new
@produtos = Produto.all
cliente = @contrato.build_cliente
cliente.build_logradouro
cliente.build_contabanco
end
def create
@contratoux = Contrato.new(contratoux_params)
respond_to do |format|
if @contratoux.save
$k = @contratoux.vencimento.to_i
$n = (1..@contratoux.produto.parcelas)
$n.each{|n|
@fin = Financeiro.create(contrato_id: @contratoux.id, parcela: n, valor: @contratoux.produto.valor1, data: Date.new(2018, 12, $k).next_month(n))
@fin.save!
}
format.html { redirect_to contratouxs_final_path, notice: 'Contrato foi criado com sucesso.' }
format.json { render :show, status: :created, location: contratouxs_path }
else
@contratoux.errors.full_messages
format.html { redirect_to contratouxs_path, alert: 'Contrato não foi criado com sucesso.' }
format.json { render json: @contratoux.errors, status: :unprocessable_entity }
end
end
end
def geracontrato
@contrato = Contrato.last
respond_to do |format|
format.pdf { render template: 'contratouxs/contratoux', pdf: 'Contrato'}
end
end
def final
end
private
# Use callbacks to share common setup or constraints between actions.
# def set_contrato
# @contrato = Contrato.find(params[:id])
# end
# Never trust parameters from the scary internet, only allow the white list through.
def contrato_params
params.require(:contrato).permit(:valor, :data, :resalva, :termosguarda, :assinaturaeletronica, :datainicio, :datafim, :periodo, :multiplicador, :quantdias, :tiposeguro, :categoriaclausulas, :quantproduto, :revendedor_id, :agente_id, :cliente_id, :produto_id, :user_id, :status ,:vencimento, :cliente, cliente_attributes: [:nome, :tel1, :email1, :tax, :nascimento, :profissao, :faixarenda, :expostapolicamente, :revendedor_id, :agente_id, logradouro_attributes: [:cep, :endereco, :numero, :bairro, :cidade, :uf], contabanco_attributes: [:banco, :conta, :digitoconta, :agencia, :digitoagencia, :revendedor_id, :agente_id, :cliente_id, :contrato_id]])
end
end
Модель /contrato.rb
class Contrato < ApplicationRecord
belongs_to :revendedor
belongs_to :agente
belongs_to :cliente
belongs_to :produto
belongs_to :user
has_many :financeiros
has_one :contabanco
accepts_nested_attributes_for :cliente
end
Модель /cliente.rb
class Cliente < ApplicationRecord
belongs_to :agente, optional: true
belongs_to :revendedor, optional: true
belongs_to :user, optional: true
has_one :logradouro, dependent: :destroy
has_one_attached :image
has_many :contratos
has_one :contabanco
validates :nome, :tel1, :email1, presence: true
accepts_nested_attributes_for :logradouro
accepts_nested_attributes_for :contabanco
end
Модель / contabanco.rb (это модель учетной записи)
class Contabanco < ApplicationRecord
belongs_to :revendedor
belongs_to :agente
belongs_to :cliente
belongs_to :contrato
end
Форма представления /_form.html.erb
<%= form_with(model: contratoux, url: contratouxs_path, local: true, id: "form-cliente") do |form| %>
....
<%= form.fields_for :cliente do |cli| %>
<%= cli.fields_for :contabanco do |conta| %>
....
<% end %>
<% end %>
<% end %>
Когда мы сохраняем (или сохраняем!) ошибку Rails, запрашиваем ContratoИдентификатор ActiveRecord :: RecordInvalid в ContratosController # create
Проверка не пройдена: требуется клиентская копия