【问题标题】:When submitting a form with a fields_for part, how can I assign the new id to the fields_for model提交带有 fields_for 部分的表单时,如何将新 id 分配给 fields_for 模型
【发布时间】:2011-04-03 03:56:22
【问题描述】:

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

class Vehiculo < ActiveRecord::Base
  has_one :poliza
end

class Poliza < ActiveRecord::Base
  belongs_to :vehiculo
end

Vehiculo 上的 create 方法如下所示:

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

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

/vehiculos/new 上的表单有一个 @fields_for 部分,其中包含来自 poliza 的字段。当我提交表单时,它会保存所有字段,但不会将刚刚从 vehiculo 创建的 id 分配给 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 表中。

【问题讨论】:

    标签: ruby-on-rails activerecord fields-for


    【解决方案1】:

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

    class Vehiculo < ActiveRecord::Base
      has_one :poliza
      accepts_nested_attributes_for :poliza
    end
    

    假设您的表单设置正确,您的params 将如下所示:

    params = {
      :vehiculo => {
        :field => "value",
        :another_field => "value",
        :poliza => {
          :poliza_field => "poliza value"
        }
      }
    }
    

    所以你在控制器中只需要:

    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
    

    [更新]

    这是您完成所有工作所需要的。

    如上所述,您需要accepts_nested_attributes_for

    接下来,确保您的新操作正在构建孩子。

    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
    

    最后,在您看来,使用fields_for :child_model 引用子模型,如下所示:

    <%= form_for @vehiculo do |f| %>
      <p>Whatever Field: <%= f.text_field :whatever %></p>
      <%= f.fields_for :poliza do |p| %>
        <p>Polizo Field: <%= p.text_field :something %></p>
      <% end %>
    <% end %>
    

    【讨论】:

    • 我刚刚添加了 'accepts_nested_attributes_for' 并删除了 '&& @poliza.save',现在它甚至没有从 poliza 中保存其他字段。我正在使用 '' 用于字段。我刚刚检查了日志,参数看起来像你说的那样,来自poliza字段的数据,但它只是在做'INSERT INTO Vehiculos'并且没有插入Polizas。任何想法为什么它不保存?
    • 这是个好问题;我并不乐观。如果你愿意做一些侦探工作,那可能会有所帮助。将您的 create 方法更改为:render :json =&gt; params and return 作为第一行,并可能使用该输出更新您的问题,我们可以从那里开始。
    • 实际上,我认为new 操作和我现在考虑的观点有些问题。我正在更新问题。
    • 现在当我调用 /vehiculos/new 时,我得到了 nil:NilClass 的“未定义方法 `build”。问题在于我添加到新方法“@vehiculo.poliza.build”的行。
    • 啊!我深表歉意,我忘了这是has_one 而不是has_many。它应该是@vehiculo.build_poliza。我会更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多