【发布时间】: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 属性构造正确,立即测试看起来很有希望。我仍在为控制器接线