Ruby on rails 提交包含零件字段的表单时,如何将新id分配给模型的字段

Ruby on rails 提交包含零件字段的表单时,如何将新id分配给模型的字段,ruby-on-rails,activerecord,fields-for,Ruby On Rails,Activerecord,Fields For,我有一个表格可以处理两个模型,Vehiculo和Poliza。这就是我现在设置它们的方式: class Vehiculo < ActiveRecord::Base has_one :poliza end class Poliza < ActiveRecord::Base belongs_to :vehiculo end /vehiculos/new上的表单中有一个@fields_,与poliza中的字段一起使用。当我提交表单时,它会保存所有字段,但不会将刚创建的id从ve

我有一个表格可以处理两个模型,Vehiculo和Poliza。这就是我现在设置它们的方式:

class Vehiculo < ActiveRecord::Base
  has_one :poliza
end

class Poliza < ActiveRecord::Base
  belongs_to :vehiculo
end
/vehiculos/new上的表单中有一个@fields_,与poliza中的字段一起使用。当我提交表单时,它会保存所有字段,但不会将刚创建的id从vehiculo分配到Polizas表上的vehiculo_id。在网上阅读了许多关于这个的问题后,它似乎应该根据模型上的关系“自动”保存它。这是真的吗?如果是这样,为什么它不起作用?如果没有,我需要向create方法添加什么以便解决这个问题

谢谢

更新: 使用json作为输出更新create方法后,如下所示:

{
  "utf8"=>"✓",
  "authenticity_token"=>"tEhNC4J17h+KvNgXv1LLkVyufQwU2uAT18P7msQxiqA=",
  "vehiculo"=>{
    "marca_id"=>"2",
    "modelo_id"=>"4",
    "color"=>"Blanco",
    "ano"=>"2011",
    "chassis"=>"123456789",
    "placa"=>"G123456",
    "cliente_id"=>"1",
    "entaller"=>"0",
    "vip"=>"0"
  },
  "poliza"=>{
    "compania"=>"Comp1",
    "numeropoliza"=>"736458",
    "vencimiento(1i)"=>"2011",
    "vencimiento(2i)"=>"9",
    "vencimiento(3i)"=>"21"
  }
}

这就是输出,因此它至少从表单中获取字段,但不会将它们插入polizas表。

您需要确保父模型接受子模型的嵌套属性:

class Vehiculo < ActiveRecord::Base
  has_one :poliza
  accepts_nested_attributes_for :poliza
end
因此,您在控制器中需要的只是:

def create
  @vehiculo = Vehiculo.new(params[:vehiculo])

  respond_to do |format|
    if @vehiculo.save #&& @poliza.save
      format.html { redirect_to(@vehiculo, :notice => 'Vehiculo was successfully created.') }
      format.xml  { render :xml => @vehiculo, :status => :created, :location => @vehiculo }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @vehiculo.errors, :status => :unprocessable_entity }
    end
  end
end
[更新]

这是你需要做的,来完成这一切

如上所述,您需要
接受\u嵌套的\u属性

接下来,确保您的新操作是构建孩子

class VehiculosController < ApplicationController
  def new
    @vehiculo = Vehiculo.new
    @vehiculo.build_poliza
  end

  def create
    vehiculo = Vehiculo.new(params[:vehiculo])
    if vehiculo.save
      redirect_to root_path, :notice => "Success"
    else
      redirect_to root_path, :alert => "Failure"
    end
  end
end

您需要确保父模型接受子模型的嵌套属性:

class Vehiculo < ActiveRecord::Base
  has_one :poliza
  accepts_nested_attributes_for :poliza
end
因此,您在控制器中需要的只是:

def create
  @vehiculo = Vehiculo.new(params[:vehiculo])

  respond_to do |format|
    if @vehiculo.save #&& @poliza.save
      format.html { redirect_to(@vehiculo, :notice => 'Vehiculo was successfully created.') }
      format.xml  { render :xml => @vehiculo, :status => :created, :location => @vehiculo }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @vehiculo.errors, :status => :unprocessable_entity }
    end
  end
end
[更新]

这是你需要做的,来完成这一切

如上所述,您需要
接受\u嵌套的\u属性

接下来,确保您的新操作是构建孩子

class VehiculosController < ApplicationController
  def new
    @vehiculo = Vehiculo.new
    @vehiculo.build_poliza
  end

  def create
    vehiculo = Vehiculo.new(params[:vehiculo])
    if vehiculo.save
      redirect_to root_path, :notice => "Success"
    else
      redirect_to root_path, :alert => "Failure"
    end
  end
end

我刚刚添加了“accepts_nested_attributes_for”并删除了“&&@poliza.save”,现在它甚至没有保存poliza中的其他字段。我正在对字段使用“”。我刚刚检查了日志和参数,如您所说,这些数据来自poliza的字段,但它只执行“插入到Vehiculos”,没有插入到Polizas。你知道为什么不储蓄吗?这是个好问题;我头脑中没有积极的想法。如果你愿意做点侦探工作,那可能会有帮助。将您的
create
方法更改为:
render:json=>params,并将
作为第一行返回,也许可以使用该输出更新您的问题,然后我们可以从那里开始。实际上,我认为
新的
操作和视图出现了一些问题。我现在正在更新这个问题。现在,当我调用/vehiculos/new时,我得到了nil:NilClass的“未定义的build”方法。问题在于我添加到新方法中的行'@vehiculo.poliza.build'.Gah!我最深的歉意,我忘了这是一个
有一个
不是一个
有很多
。它应该是
@vehiculo.build\u poliza
。我将更新答案。我只是添加了“accepts_nested_attributes_for”并删除了“&&@poliza.save”,现在它甚至没有保存poliza中的其他字段。我正在对字段使用“”。我刚刚检查了日志和参数,如您所说,这些数据来自poliza的字段,但它只执行“插入到Vehiculos”,没有插入到Polizas。你知道为什么不储蓄吗?这是个好问题;我头脑中没有积极的想法。如果你愿意做点侦探工作,那可能会有帮助。将您的
create
方法更改为:
render:json=>params,并将
作为第一行返回,也许可以使用该输出更新您的问题,然后我们可以从那里开始。实际上,我认为
新的
操作和视图出现了一些问题。我现在正在更新这个问题。现在,当我调用/vehiculos/new时,我得到了nil:NilClass的“未定义的build”方法。问题在于我添加到新方法中的行'@vehiculo.poliza.build'.Gah!我最深的歉意,我忘了这是一个
有一个
不是一个
有很多
。它应该是
@vehiculo.build\u poliza
。我会更新答案。