簡體   English   中英

導軌中nil:NilClass錯誤的未定義方法“ []”

[英]undefined method `[]' for nil:NilClass error in rails

我有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

我不明白這個問題。 有人可以向我描述這個問題嗎?

如您的回答所述,您的問題是您沒有向控制器發送正確的數據(因此params[:tags]將為空白):

形成

首先,您會在collection_select缺少form_builder對象(因此,您的標簽可能不會在正確的params哈希中發送)。 盡管這可能是設計使然,但您需要確保正確傳遞數據:

<%= 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 { "variable" => { "name" => "Acme", "phone" => "12345", "address" => { "postcode" => "12345", "city" => "Carrot City" }}}

這就是您的控制器將為錯誤[] for nil:NilClass返回[] for nil:NilClass的核心原因-您將引用不存在的參數。 您需要以params[:variable][:tags]為例

如果您將params散列回發,將會有很大幫助

您可以嘗試使用validate :tag_id, :presence => true來檢查所需參數的存在。

我在代碼中發現了2個問題:

  1. 在new.index.html(在問題視圖中)中,“提交”按鈕位於form_for中,我在form_for外部編寫了field_for,當我單擊“提交”按鈕時,未創建標簽的params哈希。

  2. 在collection_select中,我忘記添加標簽的名稱參數。

正確的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 %>

感謝您提供所有答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2025 STACKOOM.COM