Rails "следит" за проблемами контроллера отношений

Я работаю над приложением, в котором пользовательские "проекты" могут отслеживать "объекты" из базы данных. Я получаю следующую ошибку для действия create в моем контроллере "Prelationships" (Plant Relationships, который соединяет проекты пользователей с фиксированными объектами "plant"), когда я нажимаю "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)

1 ответ

Решение

Ага. Как Свон и указал, вы должны инициализировать @project объект внутри :create action, подобно @project = Project.find(params[:project_id]) если вы не делаете это с before_filter,

Если вы уже созданы @project прежде чем посмотреть, что происходит, когда вы пытаетесь вручную получить @plant объект в консоли Rails Plant.find(1)

Другие вопросы по тегам