W mojej aplikacji pojawia się obiekt, którego … nie powinno być i zupełnie nie rozumiem skąd i co gorsze powoduje błąd
Środowisko pracy to ruby 1.8.7p302 i rails 3.0.1
Mam dwa modele w relacji wiele-do-wielu:
[code]class Server < ActiveRecord::Base
has_and_belongs_to_many :daemons
validates :name, :presence=>true, :uniqueness=>true, :format=>/[a-z0-9.]{2,}/
validates :lan_ip, :presence=>true, :ip=>true
validates :public_ip, :presence=>true, :ip=>true
validates :lan_name, :presence=>true, :format=>/[a-z0-9.]{2,}/
validates :public_name, :presence=>true, :format=>/[a-z0-9.]{2,}/
default_scope :order=>:name
end
class Daemon < ActiveRecord::Base
has_and_belongs_to_many :servers
end[/code]
Do zarządzania demonami mam kontroler
[code]class DaemonsController < ApplicationController
load_and_authorize_resource :daemon
(…)
def update
respond_to do |format|
if @daemon.update_attributes(params[:daemon])
format.html { redirect_to(@daemon, :notice => t(‘daemons.flash.Daemon was successfully updated’)) }
format.xml { head :ok }
else
format.html { render :action => “edit” }
format.xml { render :xml => @daemon.errors, :status => :unprocessable_entity }
end
end
end
(…)[/code]
I jeszcze do kompletu fragment z daemons/edit.html.erb
[code]
<%= f.label :name, :class=>‘span-3 label’ %>
<%= f.text_field :name %>
Server(#-610496418) expected, got Server(#-609521148)
Rails.root: /home/tuptus/projekty/ruby/vadmin
Application Trace | Framework Trace | Full Trace
app/controllers/daemons_controller.rb:54:in update' app/controllers/daemons_controller.rb:53:in
update’[/code]
Linia 53 w kontrolerze to “respond_to”.
Zupełnie nie rozumiem skąd ten Server się bierze i gdzie konkretnie pojawia się ten błąd. Problem jest tym trudniejszy do zdiagnozowania, że w trakcie wykonania odpowiednich poleceń jest wszystko OK. Również wykonanie krok po kroku w debugerze również działa poprawnie. Problem występuje tylko przy “normalnym” działaniu aplikacji.
Pomóżcie znaleźć źródło problemu.
[Edit]
Posunąłem się o krok dalej ale …
Problem leży w ActiveRecord::Associations::AssociationProxy#raise_on_type_mismatch. Problem w tym, że wyrażenie record.is_a?(Server) czasami zwraca true a czasami nil mimo, że record jest typu Server.