Rails 表单选择不会预先选择现有条目

Rails form select does not preselect the existing entry

提问人:Julian 提问时间:10/24/2023 更新时间:10/24/2023 访问量:31

问:

情况

我正在编写一个简单的 rails(又名没有 JS)表单来创建/编辑对象。一个关联被称为 & 可以通过一个下拉列表来维护,该下拉列表通过一个选项生成:in_invoiceeur_objectform.select

<%= f.select :eur_object_id, options_for_eur_expenses, include_blank: true %>

如您所见,调用以生成选项:options_for_eur_expenses

  def options_for_eur_expenses
    options_from_collection_for_select(EurObject.expenses.sort_by(&:name), 'id', 'dropdown_name')
  end

保存和编辑对象通常工作正常。

问题

但有一个例外:如果尝试编辑对象,则尽管该值位于数据库中,但不会根据创建时选择的值进行预选。下拉列表显示一个空条目。eur_object

解决方案选项:“阅读 f******* 文档!

Rails 文档 / google / apidock 告诉我,旧条目将根据 所以在这种情况下,对象的 .但事实并非如此。下拉列表为空。ideur_object_id

因此,基本上编辑和直接保存对象而不观察到的变化将导致此关联被设置为 。因此,编辑和直接保存会删除关联,这是非常意外的行为。nil

我通过 byebug 检查了该属性是否实际得到维护。

溶液

我正在寻找基于现有值预填充下拉列表的正确方法?可能是选择表单的选项需要用“selected”选项来丰富。我以为后者会在 Rails 中自动完成,但我在这里可能错了!

Ruby-on-Rails 表单 选择 下拉菜单 助手

评论


答:

0赞 Julian 10/24/2023 #1

我终于在另一个堆栈溢出线程中找到了解决方案!

添加一个属性(添加的东西),以便方法的调用者明确指出应该预先选择调用(...因此,名称实际上应该是类似的东西,但无论如何):id.to_sidpreselected_object_id

def options_for_eur_expenses(id=nil)
   options_from_collection_for_select(EurObject.expenses.sort_by(&:name), 'id', 'dropdown_name', id.to_s)
  end

这解决了我刚刚发布的问题!:-)

0赞 max 10/24/2023 #2

您很可能不需要自己创建选项。只有在从数组创建选项时才真正需要这样做。

请改用更高级别的表单帮助程序。

<%= f.collection_select(
  :eur_object_id,  # the method on parent and the name of the select tag
  EurObject.expenses.sort_by(&:name), # this should be passed from the controller 
  :id,             # the method to call on each item for the value
  :dropdown_name,  # the method to call on each item for the label
  include_blank: true
) %>

评论

0赞 Julian 10/26/2023
谢谢@max会考虑!然后,这会自动选择以前维护的条目吗?它与我建议的解决方案有关
0赞 max 10/26/2023
是的。它选择与调用方法具有相同值的选项。
0赞 Julian 10/26/2023
那么你的解决方案甚至比我发布的更好,因为你不必明确说明id!正在寻找你建议的东西!谢谢!