4

我在 Rails 3 应用程序中保存哈希时遇到问题。使用控制台时我可以保存它 - 当我通过表单提交哈希时它不起作用。

这个 SO question 解决了它,但解决方案对我不起作用。此外,如果我使用:

 serialize :bulk_action, Hash

我得到错误:

 Attribute was supposed to be a Hash, but was a String

通过表单保存的哈希值如下所示:

 "{\"location\"=>{\"commands\"=>{\"custom_command_one\"=>\"true\", \"custom_command_two\"=>\"true\"}}}"

而通过控制台:

{"location"=>{"commands"=>{"custom_command_one"=>"true", "custom_command_two"=>"true"}}}

我的数据库字段是一个文本字段。通过表单保存哈希的最佳方法是什么?

- 编辑 -

我发现如果我使用符号而不是字符串作为名称,我可以解决这个问题,但它仍然输出一个长字符串,而不是哈希。

4

4 回答 4

1

您能否在 textarea 中切换到 JSON,这样解析它就不会那么危险了。因为您需要做的是评估控制器或模型中的相应参数条目,使用户能够对运行您的应用程序的用户做任何他们想做的事情。使用 JSON,您可以JSON.parse在设置模型属性之前使用。

于 2013-05-20T07:56:03.583 回答
0

从链接http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize

serialize(attr_name, class_name = Object)
[...] The serialization is done through YAML.

因此,该列应包含您的 bulk_action 的 YAML 化版本,但 '

 "{\"location\"=>{\"commands\"=>{\"custom_command_one\"=>\"true\", \"custom_command_two\"=>\"true\"}}}"

不是 YAML 哈希。如果您想处理原始序列化数据,那么您应该使用类似的东西

 "{\"location\"=>{\"commands\"=>{\"custom_command_one\"=>\"true\", \"custom_command_two\"=>\"true\"}}}".to_yaml
于 2013-11-30T11:11:00.847 回答
0
于 2014-08-28T14:27:47.097 回答
0

我也没有找到正确的答案(YAML.dump,to_yaml - Rails 4.0.1 中的相同错误)。只有eval可以帮助我。这不是一个大的安全问题,因为我在管理窗格中使用它。

  params[:branch][:features_attributes][:primary] = eval params[:branch][:features_attributes][:primary]
  params[:branch][:features_attributes][:secondary] = eval params[:branch][:features_attributes][:secondary]
  if @branch.update_attributes(params[:branch]) ...        
于 2013-11-30T05:05:49.230 回答