nil的未定义方法`first':NilClass Rails

时间:2016-05-20 11:04:15

标签: ruby-on-rails forms

我知道这个错误,我知道这意味着什么,但在这种情况下它完全没有意义。我有一个以前运作良好的表格。我有另一种形式几乎一样的工作很好。但是,当我提交数据时,此表单现在会出现此错误:

 Showing C:/Sites/mewwd/app/views/wine_lists/_form.html.erb where    ine #189 raised:
 undefined method `first' for nil:NilClass Rails

_form.html.erb

<%= f.collection_select :wine_list_region_id, @regioes, :id, :regiao , {hide_label: true, :selected => @regioes.first.id} , {:style => "width: 120px",:required => true} %>

控制器

def new
@wine_list = WineList.new
@tipos = WineListType.where(:user_id => [current_user.id, "0"])
@produtores = WineListProducer.where(:user_id => [current_user.id, "0"])
@regioes = WineListRegion.where(:user_id => [current_user.id, "0"])
@dosagens = WineListPriceType.where(:user_id => [current_user.id, "0"])
end

如果正确获取数据,此collection_select!一切都显示它应该的方式,但当我提交我得到那个错误,我不明白为什么。

2 个答案:

答案 0 :(得分:0)

我不知道为什么,但如果我把

 @wine_list = WineList.new
 @tipos = WineListType.where(:user_id => [current_user.id, "0"])
 @produtores = WineListProducer.where(:user_id => [current_user.id, "0"])
 @regioes = WineListRegion.where(:user_id => [current_user.id, "0"])
 @dosagens = WineListPriceType.where(:user_id => [current_user.id, "0"])

在创建动作中它起作用....我从来没有这样做过,这总是在新动作中,但现在这在创建动作中起作用。如果有人设法向我解释为什么我会接受答案

答案 1 :(得分:0)

表单代码取决于@regioes,以便为表单collection_select提供值。如果@regios未初始化,则访问first方法会导致您看到nil:NilClass错误。

在典型的Rails应用程序中,new方法用于设置要呈现到视图形式的变量,create方法用于处理在视图的表单上输入的值。将它们(通过POST)提交给控制器后的表格。 new用于显示; create用于保存。

这个问题意味着行动发生在new上,方法是在控制器的new操作中显示代码,显示表单,并在表单中显示错误。表单当然取决于@regios有一个值,如果失败,则会引发异常。如果@regios从未在new控制器中初始化,这是有道理的,尽管代码证明它确实已初始化。

答案中的后续信息表明,初始化@regioscreate操作中的其他值会导致表单生效。这意味着表单与create之间存在一些违反GETPOST行为分离的非标准关联。如果create方法以任何方式处理表单(或视图),这将是一个令人不安的情况。

如果信息正确,并且对create操作所做的更改会以某种方式影响表单,则create操作会以不恰当的方式参与GET操作。应该调查和解决原因。目前尚未提供足够的信息来确定其实际原因。这些信息至少是必需的:

  • 完成newcreate操作
  • 的方法体
  • 的完整日志 newcreate行动
  • newcreate操作的路径定义