我们有一个具有以下结构的Rails 5.2代码: 合同->客户->账户 合同有一个客户 客户有一个帐户 合同中有客户帐户。
当我们将其保存在Contract Controller中时,会出现错误并要求在帐户模型上输入Contract ID。
所有表格都使用嵌套嵌套,嵌套属性可以。
/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 ID ContratosController#create中的ActiveRecord :: RecordInvalid
验证失败:需要与contabanco相反的客户
答案 0 :(得分:0)
Rails有一个关键字autosave
,您可以在自己的belongs_to关系中使用该关键字。这应该可以为您解决大部分问题。
这里是另一个问题的解答,很好地解释了这一点。 https://stackoverflow.com/a/38068935/1146473