铁轨无法获得符号参数

时间:2012-12-13 20:31:55

标签: ruby-on-rails ruby ruby-on-rails-3.1

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

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 个答案:

答案 0 :(得分:5)

从HTML表单接收的数据始终是字符串,rails不会将这些值自动转换为符号。通常,键是符号化的,而不是值。

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

答案 1 :(得分:1)

请记住,即使您在rails视图中写入符号,所有符号也会被解析为HTML作为字符串。 HTTP没有ruby符号的概念,因此您无法将数据作为符号发送。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

Rails只解析该字符串并将其转换为名为“params”的哈希值。密钥的每个值都是基于请求的字符串或文件对象。你永远不会得到一个符号作为哈希键的值。

尝试使用

之类的字符串
'new', 'old'

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