Rails 4更新嵌套属性并避免重复信息

时间:2015-09-30 19:19:26

标签: ruby-on-rails nested-forms

我使用嵌套表单创建一个应用程序。

在我的Bur_audit模型中。

    class BurAudit < ActiveRecord::Base

    has_many :personal_adits, dependent: :destroy
    belongs_to :public_entity
    belongs_to :taking
    belongs_to :area
    before_create :validar_entidad_area_reca
    after_save :llena_tabla_per_buro_audit
    accepts_nested_attributes_for :personal_adits, allow_destroy: true 

    QUINCENA = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"]
    CALENDARIO = ((yr=Date.current.year)-7..yr).to_a

    include InformixQueryHelper

    def validar_entidad_area_reca
        entidad = self.public_entity_id
        puts entidad
        self.entidad_publica = entidad
        e = PublicEntity.find_by "entidad_publica = " + entidad.to_s  
        id = e.id
        self.public_entity_id = id

        area = self.area_id
        puts area
        self.departamento = area
        a = Area.find_by "area = " + area.to_s  
        id = a.id
        self.area_id = id

        reca = self.taking_id
        puts reca
        self.recaudacion = reca
        r = Taking.find_by "recaudacion = " + reca.to_s  
        id = r.id
        self.taking_id = id 
    end
    def llena_tabla_per_buro_audit
        id = self.id
        dependencia = self.entidad_publica
        area = self.departamento
        recaudacion = self.recaudacion
        calendario = self.calendario
        quincena = self.quincena
        bur_audit_empleado_horario(dependencia,area,recaudacion,id, calendario, quincena)
    end

end

before_safe我必须与informix Server建立连接并运行查询以获取我在与个人Adits的关系中所需的信息。

信息保存完美,但是当我更新个人广告的资料时,会在桌面上复制我的记录。

在我的控制器中尝试这个

    # encoding: utf-8
class BurAuditsController < ApplicationController
  include InformixQueryHelper

  before_action :set_bur_audit, only: [:show, :edit, :update, :destroy]

  respond_to :html, :xml, :json, :pdf, :xls, :csv

  def index
    @bur_audits = BurAudit.all
    respond_with(@bur_audits)
  end

  def show
    respond_with(@bur_audit)
  end

  def new
    @bur_audit = BurAudit.new
    respond_with(@bur_audit)
  end

  def edit
  end

  def create
    @bur_audit = BurAudit.new(bur_audit_params)
    @bur_audit.save
    respond_with(@bur_audit)
  end
def update
    @bur_audit.update(update_bur_audit_params)
    respond_with(@bur_audit)
  end

  def destroy
    @bur_audit.destroy
    respond_with(@bur_audit)
  end

  def for_auditoria_burocrata
    puts("preparandose para lanzar")
    bur_audit_empleado_horario(params[:dependencia], params[:area], params[:recaudacion])
    render json: @bur_empleado
  end

  def for_entidad_area_id

    sql = "select a.id, a.description
            from areas  a
            where a.status = 'A'
            and a.entidad_publica = '#{params[:public_entity_id]}'
            and a.fecha_efectiva in (select max(fecha_efectiva)
                                  from areas
                                  where a.area = area)
            order by description"
    @area = ActiveRecord::Base.connection.select_rows(sql)
    @area.map{|id,description|}
    respond_to do |format|
      format.json  { render :json => @area }
    end  
  end
  private
    def set_bur_audit
      @bur_audit = BurAudit.find(params[:id])
    end

    def bur_audit_params
      params.require(:bur_audit).permit(:id, :titulo, :public_entity_id, :entidad_publica, :area_id, :departamento, :taking_id, :recaudacion, :quincena, :calendario , personal_adits_attributes:[:id, :building_id, :labora_true, :absence_cause_id, :area_funcional, :tiempo_area, :per_cargo, :escolaridad, :cumple_perfil, :reg_asistencia, :horario, :viaja, :frecuencia, :jefe_directo, :funsiones, :regularizado, :observaciones, :sueldo, :_destroy])
    end

    def update_bur_audit_params
      params.require(:bur_audit).permit(personal_adits_attributes:[:id, :bur_audit_id ,:building_id,:labora_true,:absence_cause_id,:area_funcional,:tiempo_area,:per_cargo,:escolaridad,:cumple_perfil,:reg_asistencia,:horario,:viaja,:frecuencia,:jefe_directo,:funsiones,:regularizado,:observaciones,:sueldo, :_destroy])
    end

有人知道如何避免重复我的信息。

1 个答案:

答案 0 :(得分:0)

从评论中可以看出,POST操作传入的参数会导致创建重复记录。评论中提到的参数是:

  

参数:{“utf8”=&gt;“✓”,   “authenticity_token”=&gt; “中XWNmgRoLAyRYnHsIZPbnuk4ip589ozqNDDiLCUSQIMc =”,   “button”=&gt;“”,“bur_audit”=&gt; {“titulo”=&gt;“Prueba de Duplicidad”,   “public_entity_id”=&gt;“204”,“area_id”=&gt;“3011000005001”,   “taking_id”=&gt;“14”,“calendario”=&gt;“2015”,“quincena”=&gt;“16”,   的 “personal_adits_attributes”=&GT; { “0”=&GT; { “building_id”=&gt; “中”,   “labora_true”=&gt;“SI”,“absence_cause_id”=&gt;“”,“area_funcional”=&gt;“”,   “tiempo_area”=&gt;“”,“per_cargo”=&gt;“”,“escolaridad”=&gt;“”,   “cumple_perfil”=&gt;“”,“reg_asistencia”=&gt;“”,“horario”=&gt;“8:00-16:00   L-V“,”viaja“=&gt;”“,”frecuencia“=&gt;”“,”jefe_directo“=&gt;”“,   “funsiones”=&gt;“”等等

注意启动"personal_adits_attributes"=>{"0"=>的部分。这向我表明可以传入一系列personal_adits字段。延续可能会在块后面显示"1"=>

我的假设是,表单发布的信息中嵌入了多个personal_adits,由用户手动创建(例如,单击“添加个人adit”按钮)。没有迹象表明personal_adit在 bur_audits_controller 操作或 BurAudit 模型的初始化中被实例化,所以我猜它是创建多个项目的手动操作。

或者, bur_audit / _form.html.erb 文件在显示嵌套表单之前实例化多个personal_adit实例。

要最终验证,请在表单partial。

中的@bur audit的表单标记之前添加以下内容    

我希望这将是一个大于1的数字,这将显示personal_adit列表已经创建。如果它是0或1,那么深入嵌套表单以查看它们何时被创建。可能有一个UI活动有效地导致创建多个嵌套的personal_adit表单。例如,$(document).on('click'...被注册两次,因此导致单个用户操作的双重事件。

如果有帮助,请随时编辑此答案或原始问题以及其他信息。