Obiekt niewiadomego pochodzenia

W mojej aplikacji pojawia się obiekt, którego … nie powinno być i zupełnie nie rozumiem skąd i co gorsze powoduje błąd :frowning:

Ś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 %>
<%= f.label :server_ids, :class=>'span-3 label' %> <%= f.select :server_ids, Server.all.map{|s|[s.name,s.id]},{},{:size=>4,:multiple=>true} %>
[/code] Niby żadnego cudowania ale po wysłaniu formularza do metody update otrzymuję błąd: [code]ActiveRecord::AssociationTypeMismatch in DaemonsController#update

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:inupdate’[/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.

Masz problem który robi się jak użyjesz reload! w konsoli i do obiektu ActiveRecord::Base jako obiekt asocjacji przekażesz obiekt klasy Server utworzony przed wywołaniem reload! zamiast po. To Cię powinno naprawadzić na błąd w aplikacji.

s = Server.find(...) reload! x = Foo.find(...) x.server = s => raises ...Mismatch...

Nie używasz gdzieś w kodzie aby za dużo require ? Możesz spróbować zmienić na require_dependecy.

Mowiąc normalne działanie masz na myśli tryb produkcyjny czy deweloperski z użyciem rails server ?

Ustaw sobie
ActiveSupport::Dependencies.logger = Rails.logger albo Logger.new(‘filename’) i z użyciem
tail -f filename lub
tailf -f log/development.log
obserwuj jakie stał znikają i się na pojawiają przy wywołaniu
reload!
a jak to działa przy refreshowaniu strony.
Możesz się nauczyć jak to działa i przy okazji znaleźć rozwiązanie problemu

W konsoli wszystko działa jak należy. Problem pojawia się w przeglądarce, dostęp przez “rails s”.
Przeglądając logi i analizując działanie w debugerze zauważyłem, że obiekt Server powiększa się o pole “server_id”, którego nie ma w tabeli.

Czyżby jakiś błąd w Rails-ach? Ciekawe, że pojawia się tylko czasami. Jeśli zapytania z przeglądarki wychodzą sporadycznie to wszystko jest OK, jeśli wykonam kilka razy edycję demona, raz za razem to pojawia się błąd.

Co robi : “load_and_authorize_resource” i jak wygląda kod walidacji adresu ip oraz w jakim pliku leży? Jakbyś nie przejmował się za bardzo, że zobaczę twój kod i wysłał go gdzieś (a może jest na github) ? to byłoby łatwiej pomóc.

load_and_authorize_resource

to tak na oko część CanCan od Rayan

Dzięki za zainteresowanie problemem.

Z github-a nie korzystam ale kod jest dostępny na http://svn.turox.org.pl/repos/vadmin/trunk i raczej nie mam nic do ukrycia. Z tego kodu najprawdopodobniej nigdy nie powstanie kompletna aplikacja. Jestem adminem a pisanie aplikacji traktuję jedynie jako sposób na poznanie technologii. Jeśli mam zapewnić userkom i programistom właściwe wsparcie to muszę wiedzieć czego potrzebują.
Tutaj podejrzewam błędy w działaniu jakiegoś elementu RoR. Możliwe, że to błąd przy kompilacji ruby-iego (sam budowałem pakiet rpm na podstawie starszego z RH). Może też być problem z cache-em bazy danych ale nie wiem czy ma to coś wspólnego z Webrick-iem. Problem pojawia się tylko w przypadku następujących b/p po sobie kilku prób edycji demona. Testy przechodzą bez problemu, “rozsądne” działanie również nie wywołuje błędu.

Aaa… tak jak pisał @gotar, load_and_authorize_resource to CanCan.

W wolnej chwili zobaczę. Spotkałem się już parę razy z tym problemem i zawsze była to kwestia błędu aplikacji.