我使用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>
答案 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>")
选项