8

我的 Rails 应用程序中有一个 Bulletin 模型,当它创建时,许多值作为序列化哈希或数组存储在数据库中,供以后访问。我正在尝试为其中一个哈希创建一个编辑视图,但我不知道如何在我的表单中访问它。

哈希存储时如下所示:

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

我不知道如何制作一个允许我正确分配这些值的表单。我什至实际上不需要表单来填充以前存储的值,因为我在使用表单的任何时候都会完全更改它们。

4

2 回答 2

9

选项 1:更新序列化属性的单实例方法

据我所知,不可能直接从表单编辑序列化属性。

当我有这种事情时,我总是在模型中创建一个实例方法来接收参数并进行更新(如果我以砰(!)结束方法名称,也可以进行保存)。

在您的情况下,我会执行以下操作:

class Bulletin

  ...

  def update_top_offices!(params)
    params.each do |key, value|
      self.top_offices[key] = value
    end

    self.save
  end

  ...
end

选项 2:每个序列化属性键的 getter/setter

如果您真的想使用表单来更新序列化属性,另一种可能性是创建一个 getter/setter,如下所示:

class Bulletin

  ...

  def first_office
    self.top_offices[:first_office]
  end

  def first_office=(value)
    self.top_offices[:first_office] = value
  end

  ...
end

但是不要忘记保存更新的值。

选项 3:覆盖 method_missing

最后一种可能性是覆盖method_missing,但它有点复杂。

于 2013-05-22T11:40:44.353 回答
6

这是一个示例,它仅迭代 top_offices 中现有的键/值对并为它们生成表单字段。

<% @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.

如果您不信任您的用户,那么您可能需要对提交给 top_offices 的值进行完整性检查。

于 2013-05-22T15:45:33.963 回答