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

标签 ruby-on-rails ruby-on-rails-3 activerecord

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

存储时散列如下所示:

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:更新序列化属性的单实例方法

据我所知,无法直接从表单编辑序列化属性。

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

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

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但它有点复杂。

关于ruby-on-rails - 如何在表单中编辑 Rails 序列化哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16690193/

相关文章:

ruby-on-rails - Rails 中的简单推荐系统

ruby-on-rails-3 - 带有符号链接(symbolic link)的 unicorn 工作目录

ruby-on-rails - 尝试访问相关记录时未定义的方法

mysql - Rails/Mysql2/Lion [致命] 分配内存失败

mysql - 在 Rails ActiveRecord 迁移中数据类型映射到 MySQL

ruby-on-rails - Ruby on rails 全局变量?

javascript - 从 javascript 访问 Rails 路径

ruby-on-rails - Rails 3 长文本迁移

ruby-on-rails - A/B 测试和统计解决方案

ruby-on-rails-3 - rails s 或 bundle exec rails s