0

我有一个模型,这个模型有一个名称为状态的属性。这是状态验证;

validates_inclusion_of :status, :in => [:nil, :new, :old], :message => "......"

我为我的模型创建了一个编辑表单,这是我的选择输入;

 =f.select :status, [["New Record", :new], ["Old Record", :old]], {:include_blank => false}

当我提交编辑表单时,我无法获得作为符号的状态并收到有关此区域的错误。
当尝试使用“to_sym”方法更改状态参数时,它可以工作。

params[:my_model][:status] = params[:my_model][:status].to_sym

我为什么要使用这种方法?有没有办法将数据作为符号发送?

4

4 回答 4

5

从您的 HTML 表单接收的数据始终是一个字符串,并且 rails 没有将这些类型的值自动转换为符号。通常,键是符号化的,而不是值。

我建议将您的值(例如:new、:old 等)视为字符串,然后事情就会保持一致。另请注意,如果没有某种序列化,您的数据存储很可能无法处理符号(例如,它们将被转换为 yaml)。

于 2012-12-13T20:37:35.037 回答
1

请记住,即使您在 Rails 视图中编写符号,所有符号也会被解析为 HTML 作为字符串。HTTP 没有红宝石符号的概念,因此您不能将数据作为符号发送。

当您在控制器中获取参数时,如果您根据符号检查它们,则您有责任将它们解析为符号。

于 2012-12-13T20:40:36.367 回答
1

你从 params[:something] 得到的总是一个字符串。您的数据库中状态的数据类型是什么?
我想你可以这样做

validates_inclusion_of :status, :in => [nil, "new", "old"], :message => "......"

于 2012-12-13T20:42:52.650 回答
0

在 HTTP 请求中没有数据类型。数据包装在查询字符串或请求正文中,完全是字符串。

Rails 仅解析该字符串并将其转换为称为“参数”的哈希值。键的每个值都是基于请求的字符串或文件对象。您永远不会将符号作为哈希键的值。

尝试使用类似的字符串

'new', 'old'

这样您就可以避免函数调用 to_sym

于 2012-12-13T20:42:57.063 回答