【问题标题】:Custom field implementation自定义字段实现
【发布时间】:2023-03-24 09:55:01
【问题描述】:

我正在尝试将“自定义字段”添加到销售应用程序(Ruby 2、Rails 4、Postgres)。

以下是相关架构:

实现这一点的最佳方法是什么? values 是多态的,fieldsaccounts 是一对多的。

有没有办法遍历字段并获取相关值?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我可能弄错了您的问题,但我认为 Rails 正在调用您的 whatever-custom-field-label-is 方法,因为它试图获取输入的初始/默认值。

    【讨论】:

    • 我认为你可能是对的。由于自定义字段不直接属于@sale(甚至是销售模型),因此有关如何解决此问题的任何建议?
    • @Dre 您可能可以将默认值传递给 text_field 方法并避免调用,但是通过重新构建视图以使用演示者/表单可能会更好地为您服务装饰器(查看Reform)。
    【解决方案2】:

    使用像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 值的情况下做到这一点?这会在未来引起重大的性能问题吗?
    • 这是一个相当标准的东西(虽然你当然不会保存那些空值)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多