我有以下情况:
我有一个名为“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表单创建一个Os或硬件配置。像这样:
到目前为止我尝试的是这样的路线:
resources :configuration_items do
resources :os_configurations
resources :hardware_configurations
end
但剩下的对我来说有点沉重(我对铁杆很新)。
另外,我正在使用这个宝石: https://github.com/codez/dry_crud
编辑:
更具体地说,从configurationItem表单中,我可以选择操作系统或硬件配置。如果我选择操作系统配置,则会在其表单中显示模态表单。当我保存Os配置时,我必须使用前一个表单设置他的属性configuration_item,所以他还没有创建,我无法从os配置的控制器访问它。
就像在rails_admin中一样,从表单中,您可以创建并添加其他模型的新实例。
谢谢!
答案 0 :(得分: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
所以我在表单之前选择我将拥有的配置,而不是在表单中。
答案 1 :(得分: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