0

在我的 Rails 3.0 应用程序中,我想添加一个表单元素,用户可以在其中创建一系列最多 5 个关键字/值对,并将其存储在单个字段中。关键字是由用户定义的,而不是应用程序,因此我研究过的其他 SO 问题将不起作用,因为在这些示例中,代码必须提前“知道”键。

键永远是一个单词,值永远是一个简短的句子。

所以 1 位用户可能想以某种方式输入以下内容:{'snow' => 'I like snow', 'ski' => 'I like to ski'}

其他用户可能会输入相当于:{'red' => '我最喜欢的颜色是红色', 'yellow' => 'Dont eat yellow snow'}

我知道如何使用我的模型的序列化:选项,哈希到数据库存储/检索单个文本字段中的哈希。

我没有得到一种简单的方法来允许用户创建/编辑散列,而不必在 text_area 字段中实际输入 json 或散列格式。

蛮力:由于我有固定且少量的允许对(5),在我看来,我可以提供 10 个字段供他们输入 0-5 对,然后保存表单并显示逻辑以某种方式将这些对移出/移出这 10 个字段。但我无法弄清楚将这 10 个字段映射到序列化数据的逻辑。任何帮助,将不胜感激。

ELEGANT:更好的方法当然是动态生成散列编辑表单元素。(我想我读过 Rails 3.2 有这个功能,但现在升级是不可能的,因为这是一个大型、复杂的应用程序,有很多移动部件(与多个外部服务集成),所以我们不会更新到更新的 rails 4-6个月。)

4

1 回答 1

1

不是食谱,只是一些提示。

蛮力:

为您的模型创建 10 个虚拟属性 ( key1, value1, key2, value2, ...)

使用 ActiveRecord 回调来序列化/反序列化哈希

class YourModel < ActiveRecord::Base
  attr_accessor :key1, :value1, :key2, :value2, ...
  attr_accessible :key1, :value1, :key2, :value2, ...

  after_initialize do |obj|
    #map pairs to virtual attributes
    unless obj.pairs.nil?
      i=1
      pairs.each_pair do |key, val|
        obj.instance_variable_set("@key#{i}", key)
        obj.instance_variable_set("@value#{i}", val)
        i += 1
      end
    end
  end

  before_save do |obj|
    #serialize top hash
  end
end

第二种方式:

创建生成必填字段的自定义表单构建器(这里是单选按钮的示例 - 单选按钮列表的 Rails 自定义表单构建器示例,您可以轻松找到有关表单构建器的几个截屏视频和教程)

于 2012-08-02T09:32:16.237 回答