【发布时间】:2013-07-01 19:43:07
【问题描述】:
我正在开发一个允许您编辑嵌入式关联的表单(使用 SimpleForm)。我遇到的问题是嵌套模型是子类,因此它们是具有潜在不同字段的不同类型。我正在为每种类型的模型创建隐藏表单,并使用 JavaScript 来显示所选类型的表单。
仅供参考,我正在使用以下宝石:
- Rails 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,因为Car没有truck_field方法。除了抛出任何表单助手并手动管理 html 和字段值之外,我不确定如何解决这个问题。即使在谷歌上搜索了很多,我也找不到这种类型的任何例子。
如何使用现有的表单助手以标准的“Rails 方式”解决这个问题?
【问题讨论】:
-
也许这会有所帮助:stackoverflow.com/questions/3327236/…(但不确定)
-
@jethroo 谢谢,但不幸的是,答案涵盖了我的代码示例中已有的所有内容。他们省略了为不同模型处理不同字段的最后一步。
-
如果基础文档没有任何公共字段,我会考虑创建两组字段,一组用于卡车(带有新的空白实例),一组用于汽车,设置@ 987654328@ 在车辆类型切换和创建新的卡车文件。如果这对您不起作用或看起来太不优雅,其他选择是将所有字段移动到基本文档,因为如果您将汽车转换为卡车,我相信 mongoid 不会取消设置 car_field 并且您在 db 中的文档将具有比它需要。切换文档类型的正确方法是分配新文档而不是编辑现有的恕我直言。
-
@rubish 很好的提示,我也发现了。我也有一个
embeds_many关联,所以解决方案有点不同。 -
我认为 embeds_many 比嵌入一个相对容易处理,因为您可以使用现有的嵌套属性机制在一次调用中销毁旧文档并创建新文档。但是,使用 embeds_one,您将需要创建新文档并覆盖现有文档,并确保在销毁文档时需要进行任何清理(例如删除 s3 文件),它会得到妥善处理。
标签: ruby-on-rails ruby-on-rails-3 mongoid nested-attributes