【问题标题】:Rails error when failing a validate_presence_ofvalidate_presence_of 失败时出现 Rails 错误
【发布时间】:2011-03-24 12:45:57
【问题描述】:
NoMethodError in Points#create

Showing /Volumes/EXTERNAL/Proiecte/Roadie/app/views/points/_form.html.erb where line #20 raised:

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.collect
Extracted source (around line #20):

17:   </div>
18:   <div class="field">
19:     <%= f.label :section %><br />
20:     <%= f.select(:section_id, [["Select a Section name", 0]] + @sections.collect {|p| [ p.name, p.id ] }) %>
21:   </div>
22: 
23:   <div class="field">

基本上这里发生的情况是,当此表单页面中的其他字段之一(由模型验证)丢失时,rails 会吐出上面发布的错误。

一个部分有很多点,当创建一个新点时,用户应该能够选择一个父部分。

谁能解释为什么会这样?

【问题讨论】:

    标签: ruby-on-rails view erb


    【解决方案1】:

    这是因为@sections 实例变量为零。根据您的帖子,这是我猜测的情况:

    您提交的表单数据不完整,要创建哪些帖子。模型未保存,因此您重新渲染“新”操作。但是,您忘记在控制器的“新”操作中重新初始化变量。

    在 Rails 中,当您调用 render(:action => 'new') 时,它不会执行控制器的 'new' 方法中的代码。它只是呈现“新”模板,因此您仍然需要设置任何实例变量。

    【讨论】:

    • 那么我将如何重新初始化新操作中的变量?
    • 最后我将@sections 修改为Section.all
    • 通常你可以在渲染动作之前再次调用new,或者在你的控制器中编写一个辅助方法,为你的newcreate动作设置任何必要的实例变量。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2012-07-18
    • 2016-11-17
    • 2012-06-11
    • 2012-08-27
    相关资源
    最近更新 更多