用于多态/单表继承关联的 Rails 嵌套属性形式

2023-12-10

我正在开发一个表单(使用 SimpleForm),它允许您编辑嵌入的关联。我遇到的问题是嵌套模型是子类,因此它们是不同的类型,具有可能不同的字段。我正在为每种类型的模型创建隐藏表单,并使用 JavaScript 显示所选类型的表单。

仅供参考,我正在使用以下宝石:

  • 导轨3.2
  • Mongoid
  • 简单的形式

这是我迄今为止所拥有的一个简化示例:

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 方式”解决这个问题?


我想我也有类似的问题,但是不是has_one关系,我有has_many.

基本上我用过cocoongem 为每个修饰类动态添加字段(例如Car or Truck) 然后我accept_nested_attributes_for :vehicle。表单是动态构建的,提交时,参数会进入内部vehicle_attributes.

代码看起来像(更新为has_one协会):

# _form.html.haml

= simple_form_for @garage, :html => { :multipart => true } do |f|

  = f.simple_fields_for :vehicles do |vehicle|
    = render 'vehicle_fields', :f => item
    = link_to_add_association 'Add a Car', f, :vehicles, :wrap_object => Proc.new { |vehicle| vehicle = Car.new }
    = link_to_add_association 'Add a Truck', f, :vehicles, :wrap_object => Proc.new { |vehicle| vehicle = Truck.new }

= f.button :submit, :disable_with => 'Please wait ...', :class => "btn btn-primary", :value => 'Save' 

然后里面_vehicle_fields部分你检查它是什么对象(Car or Truck)并且您呈现正确的字段。

我认为这个效果非常好,并且正是我所需要的。希望能帮助到你。

我在以下位置写了更长的解释:http://www.powpark.com/blog/programming/2014/05/07/rails_nested_forms_for_single_table_inheritance_associations

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于多态/单表继承关联的 Rails 嵌套属性形式 的相关文章

随机推荐

  • Eigen 中三元运算符的类型错误

    我正在用 C 编写一个类来概括两个稀疏矩阵求解器 SparseLU 和 Sparse Cholesky 当我尝试使用三元运算符时 它说操作数类型不兼容 但如果我使用 If 语句 代码就会编译 错误 2 错误 操作数类型不兼容 const E
  • FopFactory.newInstance() 时出现 Fop 异常

    我正在使用 struts 2 并且尝试使用 fop 从 xml 和 xsl 创建 pdf 文件 我在这两个网址的基础上开发我的代码http svn apache org viewvc xmlgraphics fop trunk exampl
  • 可观察链表

    在我的 WPF 应用程序中 我有一个 ItemsControl 其项目值取决于前一个项目显示的 ViewModel 是一个音频文件 分为可变长度的部分 我需要以这种方式显示它 右侧显示日期时间 这就是我需要计算的内容 我只知道每个部分的长度
  • 当 Kubernetes 中的 configmap 更新时重新启动 Pod?

    当配置映射更改 更新时 如何自动重新启动 Kubernetes Pod 和与部署关联的 Pod 我知道有人在讨论当配置映射更改时自动重新启动 Pod 的能力 但据我所知 这在 Kubernetes 1 2 中尚不可用 所以 我认为 我想做的
  • 在powerpoint vba中更改图表的数据源

    我在 PowerPoint 中有一个条形图 想要选择行 类别 1 4 请参阅屏幕截图1 取决于我在组合框中的选择 到目前为止 这是我的代码 Private Sub ComboBox1 Change With SlideShowWindows
  • Php.Advance周历一周[重复]

    这个问题在这里已经有答案了 可能的重复 在 PHP 中获取下一个 上一个 ISO 周和年份 我正在尝试编写一个脚本 该脚本将在表格中显示一周中的几天 并且如果单击按钮 该脚本将前进一周 我设法让它一直工作到年底 然后日期就全部出错了 他就是
  • 在 PHP 中使用聚合方法和新的 MongoDB 驱动程序类

    我是蒙戈新手 我尝试获取文档的子文档 这是我的文档 id ObjectId 5900ab35c720b210c000032c name B 1 providers id ObjectId 59030550c720b211dc005e9e n
  • 在线性时间和常量空间中查找数组中缺失和重复的元素

    给你一个数组N64 位整数 N可能非常大 您知道每个整数 1 N 在数组中都会出现一次 除了有一个整数缺失和一个整数重复 编写一个线性时间算法来查找丢失和重复的数字 此外 您的算法应该在较小的恒定空间中运行 并且保持数组不变 Source
  • 如何使用 ggplot2 在一组美国县周围创建边界?

    我对使用 R 比较陌生 我正在尝试使用数据来创建美国各州的地图 以勾勒出某些区域的轮廓并为其着色 我正在尝试用黑色显示一个州及其县 除此之外 我想在县组周围创建粗红色边框 并根据我拥有的一些数据对一些县进行颜色填充 本质上我想结合这两个图像
  • 使用授权过滤器区分控制器操作

    我想要 4 个具有相同名称的操作 控制器方法可能有不同的名称 但它们的名称相同 ActionName 它们的属性对于所有 4 个都是相同的 ActionName Same name public ActionResult AnonActio
  • Swift:表视图超类错误

    我使用 Swift 创建了一个滑出菜单 我之前已经做过很多次了 但是当我今天创建它时 我收到了这个错误 参见屏幕截图 这可能只是我犯的一个简单错误 这是我认为导致问题的代码 override func tableView tableView
  • Laravel 4.2,Artisan::call() 忽略 --env 选项

    我正在构建一个应用程序 需要创建新数据库 执行迁移并通过网页播种数据库数据 我正在尝试使用 Laravel 4 2 中的以下代码来实现此目的 请注意 这是在我设置的控制器内 Artisan call migrate array env gt
  • GWT 动态区域设置

    我想设置gwt locale在 Spring 的帮助下获取用户选择的区域设置LocaleContextHolder public static final String getCurrentLocale return LocaleConte
  • 从 strings.xml 中的数组设置微调器的值

    我有一个微调器 它使用 strings xml 中的数组 如果数组有 5 个字符串 1 2 3 4 5 并且我希望微调器显示第二个 string 2 作为默认值 这可能吗 我知道我可以重新排列字符串顺序 使第一个字符串为 2 但如果旋转对话
  • 用于匹配空格或标点符号和非字母数字的正则表达式

    我有这个正则表达式 s 这与数组中的任何空格或标点符号匹配 但不是所有标点符号 我正在努力寻找与任何标点符号匹配的示例 我考虑过匹配字符不是字母数字的位置 但这会导致重音字母和不同词典的问题 是否有全包标点符号 例如 当我说标点符号时我希望
  • 使用 PyDev 出现错误: at 0x0000000002731828> [重复]

    这个问题在这里已经有答案了 我收到一个简单打印语句的错误 可能的错误是什么 已更改为浮动并尝试过 但错误仍然存 在 if name main print i i for i in range 5 error
  • Laravel 验证规则需要两个字段之一,但两个字段都不应该同时存在

    当需要两个字段中的任何一个但两个字段不应同时存在时 是否有 Laravel 验证规则 例如 手机号码和电子邮件 其中一个应该存在 但不能同时存在 不幸的是 我找不到一个 为了满足您的需求 以下是我采取的步骤 Laravel 对于制作一个的情
  • CommandParameter 与 ListView 命令绑定无关

    我没有成功从 ListView 项目发送 CommandParameter 我的代码如下
  • 第一次机会例外

    我一直在浏览 MSDN 帮助文档来掌握 Visual Basic 尝试使用计时器的示例后 将标签和计时器组件拖到设计器中 并将以下内容添加到组件子例程中 Label1 Text My Computer Clock LocalTime ToL
  • 用于多态/单表继承关联的 Rails 嵌套属性形式

    我正在开发一个表单 使用 SimpleForm 它允许您编辑嵌入的关联 我遇到的问题是嵌套模型是子类 因此它们是不同的类型 具有可能不同的字段 我正在为每种类型的模型创建隐藏表单 并使用 JavaScript 显示所选类型的表单 仅供参考