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”

class OsConfiguration < ActiveRecord::Base

  has_one :configuration_item, as: :configuration

end

class HardwareConfiguration < ActiveRecord::Base

  has_one :configuration_item, as: :configuration

end

在我的创作过程中,我首先来到了ConfigurationItem的形式。所以我的问题是,如何从 ConfigurationItem 表单创建操作系统或硬件配置。像这样的东西:

在此处输入图像描述

到目前为止,我尝试的是这样的路由:

resources :configuration_items do
    resources :os_configurations
    resources :hardware_configurations
end

但其余的对我来说有点沉重(我对 Rails 很陌生)。

另外,我正在使用这个 gem: https ://github.com/codez/dry_crud

编辑:

更具体地说,从configurationItem一个表格中,我可以选择一个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 回答