将模型嵌套到另一个嵌套模型中,然后在保存时询问第一个模型ID

时间:2018-12-21 15:52:59

标签: ruby-on-rails ruby-on-rails-5 ruby-on-rails-5.2

我们有一个具有以下结构的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相反的客户

1 个答案:

答案 0 :(得分:0)

Rails有一个关键字autosave,您可以在自己的belongs_to关系中使用该关键字。这应该可以为您解决大部分问题。

这里是另一个问题的解答,很好地解释了这一点。 https://stackoverflow.com/a/38068935/1146473