从Rails表单创建一个JSON对象

10

我有一个Ruby on Rails表单,可以将输入保存为模型属性。但其中一个属性是json数据类型。我想把多个字段输入的数据合并成一个JSON对象存储在我的模型属性中。是否有方法可以做到这一点?

如果有帮助的话,我也可以创建一个Hash,然后将其转换为json格式。基本上,我只是想将多个输入字段合并成一个字段,然后从那里处理。

谢谢!

4个回答

19

在这里需要考虑多个问题。

第一个问题是将数据从HTML表单中提取出来。如果您使用标准的Rails命名表单输入的方式,那么这将非常简单。

<input name="my_fields[value1]">
<input name="my_fields[value2]">
<input name="my_fields[sub1][value1]">
<input name="my_fields[sub1][value2]">
如果您像这样命名它们,可以使用params[:my_fields]通过params哈希以“en bloc”的方式访问它们,这将为您提供另一个包含数据的哈希表。
然后,您需要选择将此数据保存在模型中的方式。有几种选项:
1. 使用字符串属性 只需使用stringtext列并分配一个JSON字符串即可:
@my_model.my_data = params[:my_fields].to_json
  • 优点:非常简单的解决方案。
  • 缺点:几乎不可能进行SQL查询。使用Rails处理需要手动解析数据字符串。

2. 使用序列化哈希表

在模型上使用stringtext列,并将其声明为可序列化。

serialize :my_data, Hash

然后,您可以像使用简单哈希表一样使用此列,Rails将执行读取和写入操作。

@my_model.my_data = params[:my_fields]
  • 优点:仍然是一个简单的解决方案。不需要处理 JSON 字符串,使用 Rails 处理更加容易。
  • 缺点:几乎无法使用 SQL 查询。如果您需要真正的JSON字符串,则需要调用to_json

3. 使用专门的JSON数据库类型

如果您需要能够使用SQL查询数据库,则上述解决方案将无法奏效。您必须使用专门的数据类型。

许多数据库管理系统提供了以 XML 或甚至 JSON 类型形式的结构化数据类型。(例如PostgreSQL)

  • 优点:可以进行数据库查询。
  • 缺点:需要自定义解析和序列化,迁移同样如此。这种解决方案可能过于复杂。

更新:自Rails 5以来,支持JSON列类型。如果您正在使用PostgreSQL或MySQL,请在迁移中使用t.json(或t.jsonb),并像常规哈希一样使用该属性。


2
您可以将多个文件以JSON格式保存为文本,需要解析字段时再使用。
例如:
a = JSON.parse('{"k1":"val1"}')
a['k1'] => "val1"

是的,但这并不能帮助我们获取表单中的数据并将其组合在一起,这才是真正的问题。 - Cameron

0

0
你可能正在寻找一个 before_save,它将获取您的所有模型属性,并使用 .to_json 方法创建 JSON 格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接