2014-03-31 77 views
1

我有2個conotrollers和3種型號:未定義的方法`[]」爲零:NilClass誤差在導軌

型號:

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 %> 

時我運行這個項目,th E題的觀點是表演,但是當我完成了文本框,然後選擇標籤,然後點擊提交按鈕,我得到以下錯誤:

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 

我不明白的問題。任何人都可以向我描述問題?

+1

哪一行是否22.檢查參數[:標籤]是否有值...什麼是服務器日誌中顯示的參數.plz post – Bijendra

+0

@GhostRider我檢查服務器日誌,我在問題的頁面中選擇標籤,但在服務器日誌,params [:tags]沒有任何價值。 – mgh

+1

如果參數[:標籤]沒有任何然後params [:標籤] [:id]將作爲[] [:id]不能工作會發生錯誤..檢查從視圖返回的參數是什麼,並相應地改變操作代碼 – Bijendra

回答

0

我發現在我的代碼2個問題:

  1. 在新

    。 index.html(在問題視圖中),提交按鈕位於form_for中,我在form_for外部編寫field_for,當我點擊提交按鈕時,標籤的參數散列沒有創建。

  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 %> 

感謝所有的答案。

0

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

+0

我在tag.rb中使用此驗證,但得到此錯誤agein。我檢查服務器日誌,但params [:tags]沒有任何價值。 – mgh

+0

好的。你可以發佈你的_controller.rb嗎? – user3383458

1

如前所述通過你的答案,你的問題是,你不正確的數據發送到控制器(因此params[:tags]將是空白):

你首先失蹤您的collection_select中的form_builder對象(因此您的標記可能不會在正確的參數散列內發送)。雖然這可能是由設計,你需要確保你正確地傳遞數據:

<%= 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

其次,我們看不到你的形式或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哈希值,這將是一個很大的幫助

相關問題