Как работать в Rails с помощью acceptpts_nested_attributes_for, has_many и формы для редактирования или создания - PullRequest
0 голосов
/ 13 мая 2019

Я работаю над CRUD с 3 моделями и acceptpts_nested_attributes_for, я пытаюсь сохранить на bd запись модели loan_policy и в таблице соединений, кроме соответствующих идентификаторов и идентификатора сохраненной модели, которая является process_flow a столбец с именем поведение, но я не могу понять, как это сделать, правильно.

У меня уже есть 3 модели, в которых, кроме того, несмотря на правильное отображение информации, я не могу правильно сохранить в bd, имея в виду, что модель process_flow уже имеет значения в bd.

Модели

class LoanPolicy < ApplicationRecord    
 has_many :loan_policy_process_flows
 has_many :process_flows, through: :loan_policy_process_flows
 accepts_nested_attributes_for :loan_policy_process_flows
end

class ProcessFlow < ApplicationRecord
 has_many :loan_policy_process_flows
 has_many :loan_policies, through: :loan_policy_process_flows
end

class LoanPolicyProcessFlow < ApplicationRecord
 belongs_to :loan_policy
 belongs_to :process_flow
end

Контроллер

def new
 @loan_policy = LoanPolicy.new
end

def create
    @loan_policy = LoanPolicy.new(loan_policy_params)
    if @loan_policy.save!
        flash[:success] = 'Política Creada con Exito'
        redirect_to loan_policies_path
    else
        flash[:danger] = "Política No Creada"
        redirecto_to new_loan_policy_path
    end

end

def loan_policy_params
        params.require(:loan_policy).permit(
            :name,
            :description,
            :legal_document_id,
            :status,
            :minimun_range,
            :maximun_range,
            :minimun_days,
            :maximun_days,
            :monthly_interest_rate,
            :external_bureau_required,
            :credit_bureau_id,
            loan_policy_process_flows_attributes: [:process_flow_id, :behavior])
end

_form.html.erb

<%= form_with(model: loan_policy, local: true) do |form| %>
  ....
  <% ProcessFlow.all.each_with_index do |process_flow, i| %>

   <% if i == 0 %>

     <div class="col-5 col-md-5"><label class="control-label">Proceso</label></div>
     <div class="col-6 col-md-6"><label class="control-label">Comportamiento</label></div>

     <br>

     <div class="col-5 col-md-5">
      <%= check_box_tag "loan_policy[loan_policy_process_flows_attributes][][process_flow_id]", process_flow.id, @loan_policy.process_flow_ids.include?(process_flow.id), id: dom_id(process_flow) %>
      <%= label_tag dom_id(process_flow), process_flow.process_description %>

     </div>

     <div class="col-6 col-md-6">
      <%= select_tag "loan_policy[loan_policy_process_flows_attributes][][behavior]", options_for_select([['Seleccione Comportamiento', nil], ['Manual', 'Manual'], ['Automático', 'Automático']], selected: "loan_policy[process_flow_ids][behavior]" ), class: 'form-control', id: "process_flow_select_picker_"+dom_id(process_flow)%>
     </div>

   <% else %>

     <br>
     <div class="col-5 col-md-5">
      <%= check_box_tag "loan_policy[loan_policy_process_flows_attributes][][process_flow_id]", process_flow.id, @loan_policy.process_flow_ids.include?(process_flow.id), id: dom_id(process_flow), class: 'check_input' %>
      <%= label_tag dom_id(process_flow), process_flow.process_description %>
     </div>

     <div class="col-6 col-md-6">
      <%= select_tag "loan_policy[loan_policy_process_flows_attributes][][behavior]", options_for_select([['Seleccione Comportamiento', nil], ['Manual', 'Manual'], ['Automático', 'Automático']], selected: "loan_policy[process_flow_ids][behavior]" ), class: 'form-control', id: "process_flow_select_picker_"+dom_id(process_flow)%>
      </div>

   <% end %>

 <% end %>

<% end %>

Параметры, которые отправляются:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"9qK5ay2oFK86UgZ3srzR5tYG6JOCK8BQRkjpWOJG+4NYQ+A+fKI6UB29GLi9e8xlVEFho5Od6DB71QJWRzRa5g==", "loan_policy"=>{"name"=>"Policita 2", "status"=>"true", "legal_document_id"=>"4", "minimun_range"=>"120", "maximun_range"=>"2200", "minimun_days"=>"25", "maximun_days"=>"60", "monthly_interest_rate"=>"0.3", "credit_bureau_id"=>"3", "external_bureau_required"=>"Si", "loan_policy_process_flows_attributes"=>[{"process_flow_id"=>"1", "behavior"=>"Manual"}, {"behavior"=>"", "process_flow_id"=>"3"}, {"behavior"=>"Automático"}, {"behavior"=>"", "process_flow_id"=>"5"}, {"behavior"=>"Manual"}, {"behavior"=>""}, {"behavior"=>""}]}, "commit"=>"Continuar"}

Ошибка

Validation failed: Loan policy process flows process flow must exist

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

Спасибо.

...