Error inesperado relaciones entre clases


#1

Muy buenas, estoy retomando mi proyecto que deje aparc ado por los
examenes. Me he puesto a “pulir” un poco las vistas de lso distintos
elementos que conforman mi aplicacion y me he encontrado con un error
que me ha sorprendido mucho. Os explicoen que consiste con un ejemplo:

Tengo una serie de incidencias que pueden tener varios productos, esot
lo relacionno en el modelo don belongs/has_many de la siguiente forma:

class Incidence < ActiveRecord::Base
belongs_to:user
belongs_to:incidence_state
belongs_to:incidence_product
belongs_to :client
belongs_to :zonacliente

class IncidenceProduct < ActiveRecord::Base

has_many :incidences
end

#######
Es decir tengo una tabla incidences con todos los campos de las
incidencias y otra incidence_products con una columna llamada title que
contiene el producto sobre la cual se abre la incidencia.

Lo que quiero hacer es mostrar en la vista del index de la incidencia el
producto sobre el que trata esta, para ello hago:

<%=h incidence.incidence_product.title %> ...

Pero para mi sorpresa el navegador me arroja el siguiente error:

NoMethodError in Incidences#index

Showing incidences/index.html.erb where line #33 raised:

You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.title

Extracted source (around line #33):

30: <% for incidence in @incidences %>
31:


32: <%=h incidence.user_id %>
33: <%=h incidence.incidence_product.title %>
34: <%=h incidence.client_id %>
35: <%=h incidence.state_id %>
36: <%=h incidence.created_at.to_s(:short) %>

Es como si la tabla de incidence_products no contuviera nada, pero eso
no es posible porque esta rellenada con todos los productos que pueden
causar la incidencia a traves de una migracion.

La migracion es algo asi:
class AddSpIncidenceProducts < ActiveRecord::Migration
def self.up
IncidenceProduct.create(:pid=>1,:title =>"")

IncidenceProduct.create(:pid=>2,:title =>“Aria Soho”)

IncidenceProduct.create(:pid=>3,:title =>“CS 1000”)

IncidenceProduct.create(:pid=>4,:title =>“DataOffice”)

end

def self.down
end
end

No se por donde puede venir el error :frowning:


#2

Me respondo a mi mismo.

Pase a modo consola:

incidence=Incidence.find(27)
=> #<Incidence id: 27, user_id: 1, incidence_product_id: nil, client_id:
0, state_id: 1, contact: “ñññññññññ”, telephone: “ñññññññ”, email: “”,
subject: “”, description: “”, solution: “”, created_at: “2008-12-04
16:46:46”, updated_at: “2008-12-04 16:46:46”, res_method_id: nil,
related: nil, reference: nil, ir: “”, send_email: 0, level: “yellow”>

El campo incidence_product_id esta a nil, desde el gestor de la base de
datos limpie todas las incidencias creadas, abri una nueva introduciendo
ya el producto y funciona perfectamente.

Un saludo :wink: