Вложенная модель в другую вложенную модель с запросом первого идентификатора модели при сохранении - PullRequest
0 голосов
/ 21 декабря 2018

У нас есть код 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

Проверка не пройдена: требуется клиентская копия

1 Ответ

0 голосов
/ 26 декабря 2018

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

Вот ответ на другой вопрос, который это хорошо объясняет.https://stackoverflow.com/a/38068935/1146473

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...