22

親モデルは次のとおりです。

class TypeWell < ActiveRecord::Base
   ...

  has_many :type_well_phases, :dependent => :destroy
  accepts_nested_attributes_for :type_well_phases, :reject_if => lambda { |a| a[:phase_id].blank? }, :allow_destroy => true

  ...
end

ネストされたモデルは次のとおりです。

class TypeWellPhase < ActiveRecord::Base

  belongs_to :type_well
  belongs_to :phase

end

フェーズ モデルは次のとおりです。

class Phase < ActiveRecord::Base
  ... 
  has_many :type_well_phases
  ...
end

以下に示すように、親モデルのコントローラーのフェーズ (Phase モデル) テーブルからすべてのレコードをコピーして、子テーブル (TypeWellPhases) にネストされたレコードを追加します。

class TypeWellsController < ResourceController
   ...
  def new
    @new_heading = "New Type Well - Computed"
    @type_well   = TypeWell.new
    initialize_phase_fields
  end

  private

  def initialize_phase_fields
    Phase.order("id").all.each do |p|
      type_well_phase               = @type_well.type_well_phases.build
      type_well_phase.phase_id      = p.id
      type_well_phase.gw_heat_value = p.gw_heat_value
    end
  end
  ...
end

追加された子フィールドによって特定の順序を維持したいので、これを行います。コード Phase.order("id") の部分は、フェーズ テーブルにこれらのレコードが特定の順序で含まれているためです。

この後、フォームのパーシャルで以下に示すように、simple_form_for および simple_fields_for ヘルパーを使用します。

= simple_form_for @type_well do |f|
    ...
    #type_well_phases
      = f.simple_fields_for :type_well_phases do |type_well_phase|
        = render "type_well_phase_fields", :f => type_well_phase

すべてが希望どおりに機能します。その時間の大半。ただし、保存後にフォーム内の子行の順序が乱れることがあります。このアプリケーションでは順序が重要であるため、コントローラーのプライベート メソッドでこの順序付けを明示的に行います。

子レコードの削除を追加するために「繭」宝石を使用しています。この順序がときどきめちゃくちゃになる理由がよくわかりません。

このような長い投稿で申し訳ありませんが、関連するすべての詳細を前もって提供したかったのです。

ポインタに感謝します。

バーラト

4

3 に答える 3

55

より一般的な方法で説明します。Product モデルと Order モデルがあるとします。

= form_for @product do |f|
    ...
    = f.fields_for :orders do |order_fields|
        = order_fields.text_field :name

注文を名前で並べ替えたい場合は、並べ替えてください:)

それ以外の:

    = f.fields_for :orders do |order_fields|

置く:

    = f.fields_for :orders, f.object.orders.order(:name) do |order_fields|

ご覧のとおり、 has methodfのブロックのパラメーターである変数です。これは @product であるため、注文を取得し、必要な並べ替えを適用できます(少し混乱して申し訳ありません: 注文/注文)。form_forobject.orders.order(:name)

の 2 番目のパラメーターとして並べ替えられた注文を渡すことができるソリューションの鍵fields_for

PS simple_form gemを使用しても、私のソリューションには影響しません。ヘルパーに「simple_」を追加すると機能します。私の答えが他の人にとってより役に立ち、タスクに関連しすぎないようにしたかっただけです。

于 2012-05-08T20:39:53.750 に答える