【问题标题】:How to render the correct field name for a 'fake' simple_form_for field如何为“假”simple_form_for 字段呈现正确的字段名称
【发布时间】:2016-05-25 22:04:24
【问题描述】:

我使用fake input field 来获取simple_form 以呈现与模型中的字段不对应的字段。

class FakeInput < SimpleForm::Inputs::StringInput
  def input(wrapper_options = nil)
    merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
    template.text_field_tag(attribute_name, nil, merged_input_options)
  end
end

在我的表单中,我正在使用的模型是深度嵌套的。这意味着输入名称很长而且非常具体。一个Eventhas_manyPositionshas_manyResponsibilities。我想在名为position_count 的职责中添加一个假字段。

正如您在下面的标记中所见,标签为其for 属性获取正确的值,但输入没有 获取正确的name 属性。我需要更改什么(可能在fake_input.rb 类中?)以使输入具有正确的名称?

输入的正确名称应该是

event_positions_attributes_0_responsibilities_attributes_0_position_count

但假字段仅呈现为

position_count

正在呈现的标记是...

<div class="input fake optional event_positions_responsibilities_position_count">
    <label for="event_positions_attributes_0_responsibilities_attributes_0_position_count" class="fake optional control-label">Position count</label>
    <input type="text" name="position_count" id="position_count" class="fake optional">
</div>

【问题讨论】:

  • 您是否考虑过覆盖名称属性input_html: { name: 'event_positions_attributes_0_responsibilities_attributes_0_position_count' }
  • 您不只是在模型中使用虚拟属性的任何具体原因?
  • @max 没有具体原因。此方法是 simple_form wiki 中推荐的方法。
  • 我会先尝试一下 - 只需将 attr_accessor :position_count 添加到 Responsibility,您就可以像创建常规数据库列支持的属性一样创建输入。
  • 基于其他 SO 问题,似乎属性 getters/setters 是在 Rails 4 中处理虚拟属性的首选方法。由于 name 属性构造正确,立即测试看起来很有希望。我仍在为控制器接线

标签: ruby-on-rails simple-form


【解决方案1】:

因为您使用的是text_field_tag - 这是未绑定到对象的“低级”表单助手之一。

所以当您调用template.text_field_tag(attribute_name, nil, merged_input_options) 时,它实际上使用attribute_name 作为名称属性。

这与使用绑定到对象的@builder.text_field(attribute_name, merged_input_options)SimpleForm::Inputs::StringInput 不同。

更简单的方法

创建不对应于数据库列的输入的一种更简单的方法是使用“虚拟属性” - 换句话说,只是一个带有 getter 和 setter 的普通旧实例变量。

class Responsibility < ActiveRecord::Base
  # ...
  attr_accessor :position_count
end

<%= simple_form_for(@responsibity) do |f| %>
  <%= f.input :position_count %>
<% end %>

默认情况下,Simple Form 会查看数据库中的列类型 并为列使用适当的输入。

在这种情况下这是不可能的 - 我相信它会退回到 :string (&lt;input type="text&gt;") - 如果你想要 a specific type 的输入,你可以使用 as 选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2013-08-08
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多