1

VehiculoとPolizaの2つのモデルを扱うフォームがあります。これが私が今それらを設定する方法です:

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のフォームには、polizaのフィールドを含む@fields_for部分があります。フォームを送信すると、すべてのフィールドが保存されますが、作成したばかりの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テーブルに挿入していません。

4

1 に答える 1

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 %>
于 2011-04-03T04:04:27.560 に答える