如何为'假'simple_form_for字段呈现正确的字段名称

时间:2016-05-25 22:04:25

标签: ruby-on-rails simple-form

我使用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

在我的表单中,我正在使用的模型是深层嵌套的。这意味着输入名称很长且非常具体。一个Event has_many Positions has_many Responsibilities。我想在名为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>

1 个答案:

答案 0 :(得分:1)

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

因此,当您致电template.text_field_tag(attribute_name, nil, merged_input_options)时,它实际上使用attribute_name作为名称属性。

这与使用绑定到对象的SimpleForm::Inputs::StringInput的{​​{1}}不同。

更简单的方法

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

@builder.text_field(attribute_name, merged_input_options)
class Responsibility < ActiveRecord::Base
  # ...
  attr_accessor :position_count
end
  

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

在这种情况下不可能 - 我相信它会回归到<%= simple_form_for(@responsibity) do |f| %> <%= f.input :position_count %> <% end %> :string - 如果您想要输入a specific type,可以使用<input type="text>")选项