我刚刚使用带有Rails的脚手架设置了一些基本模型,我编辑了视图,以便从文本字段和选择框中获取输入。以下是一些代码段:
form_for(@town) do |f|
f.text_field :name
.
.
f.select :county_id, @counties.map{|c| [c.name, c.id]}
.
.
end
对文本字段使用验证方法“validates_presence_of”并且在选择框上没有验证我可以输入值并成功写入数据库。当我尝试通过不在文本字段中输入任何内容来测试验证时,我收到带有以下消息的NoMethodError
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.map
注意:选择框上没有验证
如果我注释掉“validate_presence_of”行,我可以毫无问题地将空白数据写入数据库。但是,如果我为文本字段编写验证代码并且它导致整个表单对象显然变为零...... Rails的验证是否会导致此问题?
非常感谢任何想法/评论。我使用Rails 2.3.4
答案 0 :(得分:5)
您尚未发布堆栈跟踪,但我假设您在map
上致电@counties
时发生错误。
您的控制器处理表单时可能有两个操作。一个(new
或edit
)显示表单并响应获取请求。另一个(create
或update
)执行模型的创建或更新。这会响应发布或发出请求,如果成功则会重定向,或者在出现验证错误时呈现new
或edit
操作(如果save
失败)。
我希望您的new
或edit
操作包含一些分配给@counties
的代码。当create
失败时,您的update
或@counties
操作还需要指定save
,以便在视图中显示。
答案 1 :(得分:1)
在您的新方法中,您如何创建@counties以及您在该变量中添加了什么?此外,如果没有看到您的新方法和创建方法,有点难以准确地说出发生了什么。当您尝试访问上面的页面或尝试提交表单时,是否收到此错误?
对于它的价值,您没有对表单对象进行验证,您对模型属性进行了验证。因此,您需要检查提交表单时传递给控制器的参数,并确保获得预期的结果。然后将这些参数与模型中的各种validates_方法进行匹配。
调试这是一个简单的情况,首先检查以确保您的表单及其中的数据是正确的,然后发送到您的控制器的参数是正确的。请记住,您需要同时检查密钥和值。
此外,使用脚本/控制台并尝试使用您希望表单发送的数据创建一些模型对象,看看会发生什么。
答案 2 :(得分:1)
你的问题是同样的症状。