【问题标题】:Instead of update, nested form creates a new one Rails嵌套表单不是更新,而是创建一个新的 Rails
【发布时间】:2014-04-29 17:55:22
【问题描述】:

我有一个包含 2 个专业人士嵌套表格的表格(证书和培训)。每一个在 Professional 模型中都有关联 accept_nested_attributes_for。我可以通过他的证书和培训创建一个新的专业人士。但是,当我保存时,不会更新证书和培训,而是创建一个新的。

我的专业控制器:

def edit
  @professional = Professional.find(params[:id])
  @component = Component.all
  cert = Certificate.where('professional_id = ?', params[:id])
  cert.each do |certificate|
    @certificate = certificate
  end
  tra = Training.where('professional_id = ?', params[:id])
  tra.each do |training|
    @training = training
  end
  @work = Work.all
  @charge = Charge.all
  @entities =Array.new
  TypeEntity.where("id IN (1,5)").each do |tent|
    @entities << tent.entities
  end
  @reg = Time.now.to_i.to_s
  @major = Major.all
  @action = 'edit'
  render layout: false
end

def update
  profesional = Professional.find(params[:id])
  if profesional.update_attributes(professional_parameters)
    flash[:notice] = "Se ha actualizado correctamente los datos."
    redirect_to :action => :index
  else
    profesional.errors.messages.each do |attribute, error|
      flash[:error] =  flash[:error].to_s + error.to_s + "  "
    end
    # Load new()
    @profesional = profesional
    render :edit, layout: false
  end
end

private
def professional_parameters
  params.require(:professional).permit(
    :name,
    :dni, 
    :professional_title_date, 
    {:major_ids => []}, 
    :date_of_tuition, 
    :code_tuition, 
    :professional_title, 
    :tuition, 
    :cv, 
    certificates_attributes: [
      :id, 
      :professional_id, 
      :work_id, 
      :charge_id, 
      :entity_id, 
      :num_days, 
      :start_date, 
      :finish_date, 
      {:component_work_ids => []}, 
      :certificate, 
      :other, 
      :_destroy
    ], 
    trainings_attributes: [
      :id, 
      :professional_id, 
      :type_training, 
      :name_training,
      :num_hours, 
      :start_training, 
      :finish_training, 
      :training, 
      :_destroy
    ]
  )
end

这是模型:

class Certificate < ActiveRecord::Base
  has_one :charge
  belongs_to :professional
end

class Professional < ActiveRecord::Base
  has_and_belongs_to_many :majors
  has_many :certificates
  has_many :trainings
  accepts_nested_attributes_for :certificates, :allow_destroy => true
  accepts_nested_attributes_for :trainings, :allow_destroy => true
end

class Training < ActiveRecord::Base
  belongs_to :professional
end

表格以此开头:

=simple_form_for([:biddings, @professional], html: { multipart: true }) do |f|

之后,我在引导向导中有 3 个表单。

【问题讨论】:

  • 您的Professional 模特在哪里?请粘贴它
  • 请分享问题中的编辑视图代码。
  • 您能否分享整个编辑视图的代码以及嵌套表单的详细信息(如果它们在单独的部分中)。如果您认为您的问题变得冗长,那么您可能需要在 Github Gist 中添加代码。
  • 你发现了吗?我有完全相同的问题,它让我发疯。表单提交后,它返回验证错误,并在我每次执行时创建一组重复的子记录。
  • 我有同样的问题,有什么解决办法吗?

标签: ruby-on-rails updates nested-forms


【解决方案1】:

确保您的Edit 表单中有Hash 中的ID 属性。 由于您的模型具有一对多,

   For each hash that does not have an id key a new record will be instantiated, unless 
   the hash also contains a _destroy key that evaluates to true.

【讨论】:

  • 你在哪里看到one-to-one association?其one-to-many association 看型号Professional
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多