2

我正在開發一個應用程序,用戶的「項目」可以跟隨數據庫中的「工廠」對象。當我在我的應用程序中爲任意數量的工廠對象點擊「Follow」時,我在「Prelationships」控制器(將用戶項目連接到固定「工廠」對象的工廠關係)中創建操作的錯誤如下:Rails「follow」關係控制器問題

「你有一個零對象時,你沒想到吧! 你可能期望陣列的一個實例。 在評估爲零時發生錯誤。[]」

我意識到這是一個大問題,是的,我幾乎是一個新手。所有的遷移應該沒問題。我感謝任何幫助 - 即使這意味着提出一個全新的解決方案。

這裏是我的控制器,被稱爲 「Prelationships」,看起來像:

class PrelationshipsController < ApplicationController 
def create              
    @plant = Plant.find(params[:prelationship][:pfollowed_id]) 
    @project.follow!(@plant) 
    respond_to do |format| 
    format.html { redirect_to @project } 
    format.js 
    end 
end 
end   

而我的 「Prelationships」 模式:

class Prelationship < ActiveRecord::Base       
attr_accessible :pfollowed_id 

    belongs_to :pfollower, :class_name => "Project" 
    belongs_to :pfollowed, :class_name => "Plant" 

    validates :pfollower_id, :presence => true 
    validates :pfollowed_id, :presence => true 
end 

而我的 「項目」 模式:

class Project < ActiveRecord::Base      
attr_accessible :title, :address, :latitude, :longitude, :state  

belongs_to :user   
has_many :prelationships, :foreign_key => "pfollower_id", 
         :dependent => :destroy 
has_many :pfollowing, :through => :prelationships, :source => :pfollowed 

def pfollowing?(pfollowed) 
    prelationships.find_by_pfollowed_id(pfollowed) 
end 

def pfollow!(pfollowed) 
    prelationships.create!(:pfollowed_id => pfollowed.id) 
end 
end 

而我的「植物」模型:

class Plant < ActiveRecord::Base  

has_many :prelationships, :foreign_key => "pfollowed_id", 
         :class_name => "Prelationship" 
has_many :pfollowers, :through => :reverse_prelationships, 
         :source => :pfollower 
end 

最後,我的 「_plants_form」 部分的觀點:

<%= form_for @project.prelationships.build(:pfollowed_id => 
              @project_id) do |f| %> 
    <%= collection_select(:prelationships, :pfollowed_id, Plant.all, :id, :name, 
    options = {:prompt => "Select your plants"}, :class => "listselect") %> 
    <div class="actions"><%= f.submit "Pfollow" %></div> 
<% end %> 

下面是從我日誌中的錯誤:

Started POST "/prelationships" for 127.0.0.1 at 2011-11-20 23:31:57 +0100 
Processing by PrelationshipsController#create as HTML 
Parameters: {"utf8"=>"✓",  
"authenticity_token"=>"NKqa1f0M2yPLQDHbRLnxl3SiwBeTus/1q1hpZjD7hgY=",  
"prelationships"=>{"pfollowed_id"=>"5"}, "commit"=>"Pfollow"} 
Completed 500 Internal Server Error in 14ms 

NoMethodError (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.[]): 
app/controllers/prelationships_controller.rb:4:in `create' 

Rendered /Users/mmelone12/.rvm/gems/ruby-1.9.2-p290/gems/actionpack- 
3.0.9/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.4ms) 
Rendered /Users/mmelone12/.rvm/gems/ruby-1.9.2-p290/gems/actionpack- 
3.0.9/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb  
(30.6ms) 
Rendered /Users/mmelone12/.rvm/gems/ruby-1.9.2-p290/gems/actionpack- 
3.0.9/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within 
rescues/layout (37.1ms) 
+0

可以粘貼錯誤的回溯會發生什麼? – ShiningRay

+0

請讓我知道你是否需要其他任何東西來幫助破解這個 –

+1

「@ project」在哪裏被實例化? – Swanand

回答

1

沒錯。像Swanand指出的那樣,您應該在:create action內初始化@project對象。像@project = Project.find(params[:project_id]),如果你不這樣做before_filter

如果您已經實例@project前,看到當您嘗試手動檢索Rails的控制檯@plant對象Plant.find(1)

+0

啊,是的!謝謝。一個非常大的疏忽。這解決了這個問題......儘管在':create action'中插入代碼片段後仍然存在問題,我現在正在接收提交後的'找不到沒有ID的項目'錯誤消息'_plants_form'部分。我猜測我的REST風格的操作存在一些脫節,儘管對於我所犯的錯誤有任何分歧的想法都將不勝感激。 –

+0

檢查嵌套的路線。他們可能會幫助你很多。特別是閱讀/觀看瑞恩對此的看法。 (Railcasts#196 +#197)。你可能也想檢查inherited_resources和simple_form gems。享受編碼。 – Everyman

+0

非常感謝,會做。 –