未定义的方法`[]' for nil:rails中的NilClass错误

时间:2014-03-31 07:33:12

标签: ruby-on-rails ruby-on-rails-4

我有2个控制器和3个型号:

型号:

problem.rb

class Problem < ActiveRecord::Base
  has_many :problemtags
  has_many :tags, :through => :problemtags
end

tag.rb

class Tag < ActiveRecord::Base
  validate :name, :presence => true
  has_many :problemtags
  has_many :problems, :through => :problemtags
end

problemtag.rb

class Problemtag < ActiveRecord::Base
  belongs_to :problem
  belongs_to :tag
end

problems_controller.rb

class ProblemsController < ApplicationController
def new
  @all_tags = Tag.all
  @new_problem = @problem.problemtags.build
end
def create
  params[:tags][:id].each do |tag|
    if !tag.empty?
      @problem.problemtags.build(:tag_id => tag)
    end
  end
end
def problem_params
  params.require(:problem).permit(:reporter_id, :status, :date_time, :trace_code)
end

tags_controller.rb

//tags_controller is generate with scaffold

我在问题视图中有以下代码:

new.html.erb

<%= fields_for(@new_problem) do |f| %>
    <div class="field">
      <%= f.label "All Tags" %><br>
      <%= collection_select(:tags, :id, @all_tags, :id, {}, {:multiple => true}) %>
    </div>
<% end %>

当我运行项目时,问题的视图显示,但是当我完成文本字段并选择标签然后单击提交按钮时,我得到以下错误:

NoMethodError in ProblemsController#create
undefined method `[]' for nil:NilClass

Extracted source (around line #22):   
  @problem = @reporter.problems.build(problem_params)

  params[:tags][:id].each do |tag|
    if !tag.empty?
      @problem.problemtags.build(:tag_id => tag)
    end

我不明白这个问题。任何人都可以向我描述这个问题吗?

3 个答案:

答案 0 :(得分:1)

正如您的回答所述,您的问题是您没有向控制器发送正确的数据(因此params[:tags]将为空白):

<强>表格

您首先错过form_builder中的collection_select对象(因此您的代码可能不会在正确的参数哈希中发送)。虽然这可能是设计上的,但您需要确保正确传递数据:

<%= fields_for(@new_problem) do |f| %>
    <div class="field">
      <%= f.label "All Tags" %><br>
      <%= f.collection_select(:tags, :id, @all_tags, :id, {}, {:multiple => true}) %>
    </div>
<% end %>

<强> PARAMS

其次,我们无法看到你的形式或参数哈希。这很重要,因为您的表单需要如下所示:

<%= form_for @variable do |f| %>
    <%= f.text_field :value_1 %>
    <%= f.text_field :value_2 %>
<% end %>

这样就创建了一个params哈希:

params { "variable" => { "name" => "Acme", "phone" => "12345", "address" => { "postcode" => "12345", "city" => "Carrot City" }}}

这将是您的控制器返回[] for nil:NilClass错误的核心原因 - 您将引用不存在的参数。您需要拨打params[:variable][:tags]作为示例

如果您发回params哈希值,那将是一个很大的帮助

答案 1 :(得分:0)

您可以尝试使用validate :tag_id, :presence => true检查是否存在所需的参数。

答案 2 :(得分:0)

我在代码中发现了2个问题:

    在new.index.html中的
  1. (在问题视图中),提交按钮位于form_for中,我在form_for外写了field_for,当我点击提交按钮时,标签的参数哈希没有创建

  2. 在collection_select中,我忘了添加标签的名称参数。

  3. 更正new.html.erb代码:

    <%= form_for @problem do |f| %>
        status: <%= f.text_field :status %><br/>
        datetime: <%= f.datetime_select :date_time %><br/>
        trace code: <%= f.text_field :trace_code %><br/>
    
        <%= fields_for(@new_problem) do |f| %>
            <div class="field">
              <%= f.label "All Tags" %><br>
              <%= collection_select(:tags, :id, @all_tags, :id,:name, {}, {:multiple => true}) %>
            </div>
        <% end %>
        <%= f.submit %>
    <% end %>
    

    感谢所有答案。