3

背景:我的目标是让视图显示“条件”has_many 对象的列表,这些对象本身就是 StateDescription 的 STI 子类。我希望用户能够从下拉菜单中选择他们的状态描述类型(最终将有条件地显示不同类型的表单)

在我的主要表单中,我正在做一个这样的嵌套表单:

  <%= f.fields_for :conditions do |e| %>   
    <li>
        <%= e.select(:type, StateDescription.subclasses.collect{|x| x.to_s}, options_for_select(StateDescription.subclassSelectForms)) %>
        <br>
        <%= e.label :title %>
        <%= e.text_field :title %>
    </li>
  <% end %>

这适用于底部的文本字段(我可以更改值并保存它们等)。但是当我尝试做一个选择语句时,它会爆炸。

具体来说,如果我不使用 e.select 而只是这样做:

<%= select(:type, StateDescription.subclasses.collect{|x| x.to_s}, options_for_select(StateDescription.subclassSelectForms)) %>

它渲染得很好,但实际上并没有改变任何值,因为它与模型无关。

如果我不再试图让它显示一个与它提交的值不同的值,那么就做

<%= e.select(:type, StateDescription.subclasses.collect{|x| x.to_s}) %>

然后它工作得很好(我可以提交,值保存到数据库中,我可以检索它,等等)。

我可以像这样离开它,但我希望让我的更易读的字符串显示而不是 rails 类的东西(对于非程序员最终用户来说,这可能看起来像胡言乱语)。

所以,我的问题是:为什么 options_for_select 在嵌套并与表单关联时会中断,但在不与表单关联时似乎不会?它只是一个已知的错误吗?难道我做错了什么?

编辑:

.subclasses 是一个标准的 rails 调用,它返回一个对象的子类列表。

.subclassSelect forms遍历每个子类,并将其转换为表单的哈希:

{subclass.to_s => subclass.human_readable_string} 并将它们全部编译成一个数组。

我知道这个哈希数组有效,因为如果我不把“e”放在前面,它会正确显示并且对我所做的工作“正确”(即根据我选择的人类可读字符串正确返回子类下拉菜单,但由于它实际上并未与任何表单相关联,因此不会在控制器中设置)。

4

0 回答 0