4

埋め込まれた関連付けを編集できるフォーム (SimpleForm を使用) に取り組んでいます。私が直面している問題は、ネストされたモデルがサブクラスであるため、潜在的に異なるフィールドを持つ異なるタイプであることです。モデルのタイプごとに非表示のフォームを作成し、JavaScript を使用して選択したタイプのフォームを表示しています。

参考までに、次の宝石を使用しています。

  • レール3.2
  • モンゴイド
  • シンプルフォーム

これまでに私が持っているものの簡単な例を次に示します。

class Garage
  include Mongoid::Document
  embeds_one :vehicle
  accepts_nested_attributes_for :vehicle
end

class Vehicle
  include Mongoid::Document
  embedded_in :garage
  attr_accessible :_type
end

class Car < Vehicle
  field :car_field
  attr_accessible :car_field
end

class Truck < Vehicle
  field :truck_field
  attr_accessible :truck_field
end

コンソールで:

> garage = Garage.new
> garage.vehicle = Car.new(car_field: 'something')
> garage.save!

形式:

= simple_form_for @garage do |f|
  = f.input :vehicle do |vehicle_form|
     = vehicle_form.input :_type, collection: ['Car', 'Truck']

  %span.hide{data:{fields-for:'Car'}}
    = vehicle_form.input :car_field

  %span.hide{data:{fields-for:'Truck'}}
    = vehicle_form.input :truck_field

:coffeescript
  $('#garage_vehicle_attributes__type').change ->
    type = $(@).find('option:selected').val()
    $('[data-fields-for="' + type + '"]').show()

この例で発生する問題は、メソッドがないtruck_fieldために をレンダリングできないことです。フォーム ヘルパーを破棄し、html とフィールドの値を手動で管理する以外に、この問題を解決する方法がわかりません。何度もグーグル検索した後でも、このタイプのフォームの例を見つけることができませんでした。Cartruck_field

この問題は、既存のフォーム ヘルパーを使用して標準の「Rails 方式」でどのように解決できますか?

4

2 に答える 2

1

これは、フォームをモデルに直接マッピングすることが理想的でない状況の 1 つです。ユーザー入力フォーム マップと永続化モデル インスタンスは、2 つの非常に異なる概念だと思います。

フォーム データを受け入れるために使用されるクラスに Vehicle をサブクラス化してみてください。次に、フォームに固有のものを処理するために必要なすべての追加コードを混ぜます。Vehicleこのようにして、モデルをきれいに保ちます。メソッドをオーバーライドしVehicleFormModelてファクトリのように動作させ、オブジェクトの作成時に正しいインスタンスを構築することもできます。コントローラーで、Vehicle の代わりに VehicleFormModel をインスタンス化します。

class VehicleFormModel < Vehicle
  include Car::FormModel
  include Truck::FormModel

  def self.build
    # Use a form field to handle specifics for each type,
    # delegating to the mixed in FormModel as needed
  end

end

class Car < Vehicle
  module FormModel
    def self.included(base)
      base.class_eval do
        field :car_field
        attr_accessible :car_field
      end
    end
  end
end
于 2013-07-04T16:09:14.237 に答える