Ruby on rails 如何在表单中编辑Rails序列化哈希?

Ruby on rails 如何在表单中编辑Rails序列化哈希?,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我在Rails应用程序中有一个公告模型,当它被创建时,很多值都以序列化哈希或数组的形式存储在数据库中,以便以后访问。我试图为其中一个散列创建一个编辑视图,但我不知道如何在表单中访问它 哈希在存储时如下所示: top_offices = { first_office: "Office Name", first_office_amount: 1234.50, second_office: "Office Name", second_office_amount: 1234.50 } 等等。。。有五

我在Rails应用程序中有一个公告模型,当它被创建时,很多值都以序列化哈希或数组的形式存储在数据库中,以便以后访问。我试图为其中一个散列创建一个编辑视图,但我不知道如何在表单中访问它

哈希在存储时如下所示:

top_offices = { first_office: "Office Name", first_office_amount: 1234.50, 
second_office: "Office Name", second_office_amount: 1234.50 }
等等。。。有五个办公室

因此,在控制台中,我可以通过以下操作编辑值:

bulletin = Bulletin.last
bulletin.top_offices[:first_office] = "New Office"
bulletin.top_offices[:first_office_amount] = 1234.00
bulletin.save
我不知道如何制作一个表单,允许我正确地分配这些值。我甚至不需要表单来填充以前存储的值,因为我在使用表单时会完全更改它们。

选项1:更新序列化属性的单实例方法 据我所知,直接从表单编辑序列化属性是不可能的

当我遇到这种情况时,我总是在模型中创建一个实例方法,该方法接收参数并进行更新(如果我用bang(!)结束方法名,也可以进行保存)

在你的情况下,我会做以下工作:

课堂简报
...
def更新_顶级办公室!(参数)
参数每个do |键、值|
self.top_offices[键]=值
结束
自救
结束
...
结束
选项2:每个序列化属性键的getter/setter 如果确实要使用表单更新序列化属性,另一种可能性是创建getter/setter,如下所示:

课堂简报
...
国防部第一办公室
自选高级办公室[:第一办公室]
结束
def第一办公室=(值)
self.top\u offices[:first\u office]=值
结束
...
结束
但别忘了保存更新的值

选项3:缺少覆盖方法
最后一种可能是覆盖
方法\u missing
,但它有点复杂。

这里有一个示例,它只是迭代顶级办公室中现有的键/值对,并为它们生成表单字段

<% @bulletin.top_offices.each do |key, value| %>
  <input name="bulletin[top_offices][<%= key %>]" type="text" value="<%= value %>" />
<% end %>

将产生:

<input name="bulletin[top_offices][first_office]" ... />
<input name="bulletin[top_offices][first_office_amount]" ... />
# etc.

#等等。

如果您不信任您的用户,那么您可能需要对提交给顶级办公室的值进行健全性检查。

好的。我想我可以通过选择一来解决这个问题。我可能更喜欢第二种方法,但我不知道它在我的脑海中是如何运作的。如何在表单中使用这些方法?一旦我定义了
表单标签
和一些
文本字段标签
:第一办公室等等,然后提交给我的更新操作,我就可以做一个
表单标签
和一些
文本字段标签了吗?*\u字段视图帮助程序正在查找给定表单的对象的给定属性名称。因此,如果您为@bulletin do | f |
创建了
form_,然后创建了
f.text_字段:first_office
,那么
text_字段
助手将调用对象上名为
first_office
的内容。它可以是属性或方法。这就是“魔法”部分;)