【发布时间】:2023-03-24 09:55:01
【问题描述】:
我正在尝试将“自定义字段”添加到销售应用程序(Ruby 2、Rails 4、Postgres)。
以下是相关架构:
实现这一点的最佳方法是什么? values 是多态的,fields 与 accounts 是一对多的。
有没有办法遍历字段并获取相关值?
【问题讨论】:
标签: ruby-on-rails ruby
我正在尝试将“自定义字段”添加到销售应用程序(Ruby 2、Rails 4、Postgres)。
以下是相关架构:
实现这一点的最佳方法是什么? values 是多态的,fields 与 accounts 是一对多的。
有没有办法遍历字段并获取相关值?
【问题讨论】:
标签: ruby-on-rails ruby
我可能弄错了您的问题,但我认为 Rails 正在调用您的 whatever-custom-field-label-is 方法,因为它试图获取输入的初始/默认值。
【讨论】:
@sale(甚至是销售模型),因此有关如何解决此问题的任何建议?
text_field 方法并避免调用,但是通过重新构建视图以使用演示者/表单可能会更好地为您服务装饰器(查看Reform)。
使用像text_field 这样的帮助器需要有一个用于命名属性的getter 方法。 Rails 将使用它来预填充该字段。
跨多个模型的表单的内置方法是嵌套属性。
如果您将accepts_nested_attributes_for :values 添加到您的销售模型中,那么
= @sale.fields_for :values do |value_form|
= value_form.label :data, value_form.object.field.label
= value_form.text_field :data
应该为每个值呈现标签和文本字段(块将为每个值生成一次)。
或者,您可以完全避开 rails 助手。
如果你输入你的表格
= text_field_tag "sale[values_hash][#{v.field.label}]", v.data
然后它应该在不改变模型的情况下进行渲染。当表单提交时,params[:sale][:values_hash] 将是字段标签到输入值的哈希值。您需要在模型上使用 values_hash= 方法,否则保存会失败。如果你沿着这条路线走得足够远,你最终会得到 rails 的嵌套属性,尽管这可能会给你更多的控制权。
还有其他方法可以处理 Rails 中的复杂表单。一种是创建表单对象,这些对象仅负责在持久性对象和表单表示之间编组数据,从而将表单与必须知道属性 X 存储在单独的表中以及诸如此类的事情隔离开来
【讨论】:
values 并且没有任何显示。
null 值的情况下做到这一点?这会在未来引起重大的性能问题吗?