1

次のような状況があります。

「ConfigurationItem」というモデルがあります。

class ConfigurationItem < ActiveRecord::Base

  belongs_to :contract_asset
  belongs_to :provider

  belongs_to :configuration, polymorphic: true


  validate :name, :contract_asset, presence: true

end

次に、「OsConfiguration」と「HardwareConfiguration」の 2 つのモデルを今のところ用意しています。

class OsConfiguration < ActiveRecord::Base

  has_one :configuration_item, as: :configuration

end

class HardwareConfiguration < ActiveRecord::Base

  has_one :configuration_item, as: :configuration

end

作成のプロセスでは、最初に ConfigurationItem の形式に到達します。私の質問は、ConfigurationItem フォームから Os またはハードウェア構成を作成するにはどうすればよいかということです。このようなもの:

ここに画像の説明を入力

私がこれまでに試したことは、次のようにルーティングすることです。

resources :configuration_items do
    resources :os_configurations
    resources :hardware_configurations
end

しかし、残りは私にとって少し重いです(私はレールに非常に慣れていません)。

さらに、私はこの宝石を使用しています: https://github.com/codez/dry_crud

編集:

具体的に言うと、configurationItem フォームから、OS またはハードウェア構成を選択できます。OS構成を選択すると、モーダルフォームが彼のフォームとともに表示されます。Os 構成を保存するとき、彼の属性 configuration_item を前のフォームで設定する必要があるため、彼はまだ作成されておらず、os 構成のコントローラーからアクセスできません。

rails_admin のように、フォームから他のモデルの新しいインスタンスを作成して追加できます。

ありがとう !

4

2 に答える 2

1

これが私の解決策です。ConfigurationItemのリストビューで、ドロップダウンメニューを追加しました

%ul.dropdown-menu.pull-right
      - ConfigurationItemsController::ITEM_TYPES.keys.each do |type|
        %li= link_to("Add #{type.titleize} Item", new_contract_contract_asset_configuration_item_path(@contract, @contract_asset, type: type))

私の ConfigurationItemsController では、ドロップダウンのタイプで構成を作成します。

ITEM_TYPES = { 'plain'    => nil,
                 'os'       => OsConfiguration,
                 'hardware' => HardwareConfiguration }

before_filter :assign_configuration_type, only: [:new, :create]

def assign_configuration_type
    if type = ITEM_TYPES[params[:type]]
      entry.configuration = type.new
    end
end

def models_label(plural = true)
    if @configuration_item
      if config = @configuration_item.configuration
        "#{config.class.model_name.human.titleize} Item"
      else
        "Plain Configuration Item"
      end
    else
      super(plural)
    end
end

ConfigurationItem のフォーム ビューで、構成のフィールドでフォームを拡張します。

- if entry.new_record?
    = hidden_field_tag :type, params[:type]

- if @configuration_item.configuration
    = f.fields_for(:configuration) do |fields|
      = render "#{@configuration_item.configuration.class.model_name.plural}/fields", f: fields

そのため、フォーム内ではなく、フォームの前に構成を選択します。

于 2013-10-31T11:41:58.750 に答える
0

オブジェクトを作成する configuration_items_controller で、ドロップダウン入力からの選択を確認し、代わりにそのオブジェクトを作成するために設定されている内容に応じて選択します。

def create
 item = ConfigurationItem.new
 ... do what you need to here ...
 item.save
 if (params[:dropdown]=='OS Configuration')
   os_config = OSConfiguration.new
   ... do what you need to ...
   os_config.configuration_id = item.id
   os_config.save
 elseif (params[:dropdown]=='Hardware Configuration')
   hardware_config = HardwareConfiguration.new
   ... do what you need to ...
   hardware_config.configuration_id = item.id
   hardware_config.save
 end
end
于 2013-10-17T14:44:34.820 に答える