情况
我正在编写一个简单的 Rails(又名无 JS)表单来创建/编辑对象
in_invoice
。一种关联称为 eur_object
,可以通过通过 form.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 告诉我,将根据
id
选择旧条目,因此在本例中对象是 eur_object_id
。但这种情况并非如此。下拉菜单为空。
因此,基本上编辑并直接保存对象而不观察到更改将导致此关联被设置为
nil
。因此,编辑并直接保存会删除关联,这是非常意外的行为。
我通过 byebug 检查该属性实际上已维护。
解决方案
我正在寻找基于现有值预填充下拉列表的正确方法?可能是选择表单的选项需要通过“选定”选项等来丰富。我认为后者会在 Rails 中自动完成,但我在这里可能是错的!
我终于在另一个堆栈溢出线程中找到了解决方案!
添加一个属性(添加了
id.to_s
东西),以便方法的调用者明确指出应该预先选择哪个 id
...因此名称实际上应该类似于 preselected_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
这解决了我刚刚发布的问题! :-)