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

非常感谢,会做。 –