0

我目前正在创建一个复杂的 rails 表单,用于与嵌套表单和集合选择的 1:n 关系,并使用另一个数据表中的值。

到目前为止,只要用户在更新之前没有选择正确的值,它就会用 collection_select 的值列表中的第一个条目覆盖数据库值。我仍然需要正确设置 collection_select 中的初始值。

我已经阅读了很多关于 SO 的问题,最相关的是: f-collection-select-not-displaying-the-selected-value

唯一仍然缺少的(我希望!)是从数据库中设置表单字段的值,因此即使用户没有触摸选择,它也不会被选择的可选值中的默认值覆盖.

此代码段源自我的代码和上述问题的解决方案,并且是错误的。

让一个人拥有许多事物,validthings 包含事物的可能值:

在 things 表中只有 Thing 字符串,它们也在 validthings 表中。可以给 collection_select 选择的参数一个来自 things 表的字符串,该字符串可以在 validthings 表的值列表中识别。

<div class="col-md-12">
  <%= form_for(@person) do |f| %>
    <%= f.fields_for :things do |d| %>
      <%= d.hidden_field :id %><%= d.hidden_field :person_id %>
      <%= d.collection_select(:Thing, Validthings.all, :Thing, :Thing, {:selected => @person.things.map(&:id).Thing.to_s} ) %>
    <% end %>
  <% end %>
</div>

这是错误的:

@person.things.map(&:id).Thing.to_s

是的,在表格中的人物和事物以及有效事物中,该列被命名为“事物”。它是表validthings 中的唯一字符串——数据库结构不是我的主意,我只使用它。

4

1 回答 1

0

在这里找到了一个有用的答案:rails-accessing-current-value-of-a-symbol to another subject,但我的问题是我不知道如何访问我知道必须已经加载的信息。

这就是我如何将 collection_select 的默认值指定为数据库中的数据的方式:

<div class="col-md-12">
  <%= form_for(@person) do |f| %>
    <%= f.fields_for :things do |d| %>
      <%= d.hidden_field :id %><%= d.hidden_field :person_id %>
      <%= d.collection_select(:Thing, Validthings.all, :Thing, :Thing, {:selected => d.object.Thing} ) %>
    <% end %>
  <% end %>
</div>

其中d.object.Thing是属性“Thing”的表单元素的相应对象的值,该属性已经存在于表单中。

如果我的方法不像红宝石或类似的,我将非常感谢建设性的想法。我对 ruby​​、rails 等比较陌生。

于 2015-03-20T13:42:23.823 回答