0

Rails 3.2.* では、次のような has_one belongs_to ネストされたモデルがあります。

class Unicycle < ActiveRecord::Base
  attr_accessible :brand, :wheel, :wheel_attributes
  has_one :wheel
  accepts_nested_attributes_for :wheel
end

class Wheel < ActiveRecord::Base
  attr_accessible :diameter, :unicycle
  belongs_to :unicycle
end

私のコントローラーは次のようになります。

class UnicyclesController < ApplicationController
  def index
    @unicycles = Unicycle.all
  end

  def edit
    @unicycle = Unicycle.find_by_id params[:id]
  end

  def update
    @unicycle = Unicycle.find_by_id params[:id]
    if @unicycle.update_attributes! params[:unicycle]
      redirect_to unicycles_path
    else
      render 'edit'
    end
  end
end

そして、私の edit.html.erb は次のようになります:

<%= form_for @unicycle do |formbuilder| %>
  <%= formbuilder.text_field :brand %>

  <%= fields_for @unicycle.wheel do |fieldbuilder| %>
    <%= fieldbuilder.number_field :diameter %>
  <% end %>

  <%= formbuilder.submit %>
<% end %>

しかし、更新すると、 wheel.diameter に加えられた変更は黙って無視されます。

fields_for呼び出しがform_foredit.html.erb のブロック内にネストされていても、更新関数に送信されるパラメーターがネストされていないことがわかりました。

Params には以下が含まれます。

 {"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"owiV5xwbbt+ft8h4K4bIqshp5I6jrlj5XWEKeVXpoCQ=",
 "unicycle"=>{"brand"=>"Unibike"},
 "wheel"=>{"diameter"=>"70"},
 "commit"=>"Update Unicycle",
 "action"=>"update",
 "controller"=>"unicycles",
 "id"=>"1"}

しかし、Rails のドキュメント ( ActiveRecordNestedAttributes ) によると、ホイール パラメータは実際には次のように一輪車内にネストする必要があります。

 "unicycle"=>{"brand"=>"Unibike", "wheel"=>{"diameter"=>"68"}},

ここで何が欠けていますか?

4

1 に答える 1

0

ネストされたフィールドを生成する方法は次のとおりです。

# ...
<%= formbuilder.fields_for :wheel do |fieldbuilder| %>
  <%= fieldbuilder.number_field :diameter %>
<% end %>
# ...
于 2013-02-27T23:57:18.643 に答える