2012-03-24 17 views
1

Ich habe ein Problem mit Rails 3.2.1, eine verschachtelte Ressource beschwert sich über eine nicht initialisierte Konstante, ich kann nicht herausfinden, warum, weil mir scheint, dass ich das getan habe Genau wie bei einem anderen Modell, wo das funktioniert hat. Irgendwann dachte ich, ich könnte irgendwo ein reserviertes Wort verwenden, sondern ändern sich die Modellnamen nicht helfen ...Rails 3.2, verschachtelte Ressource, nicht initialisierte Konstante

Fehler:

uninitialized constant Brand::Series 
Extracted source (around line #11): 

8: </article> 
9: 
10: 
11: <% @series.each do |serie| %> 
12:  <article class='serie_block'> 
13:   <%= serie.name %> 
14:  </article> 

brand.rb

class Brand < ActiveRecord::Base 
    has_many :series, :order => "name, id ASC", :dependent => :destroy 
end 

serie.rb

class Serie < ActiveRecord::Base 
    belongs_to :brand 
end 

brands_controller.rb

def show 
    @brand = Brand.find(params[:id]) 
    @series = @brand.series 
end 

Marken/show.html.erb

<% @series.each do |serie| %> 
<article class='serie_block'> 
    <%= serie.name %> 
</article> 
<% end %> 

Ich bekomme die gleiche "nicht initialisierte Konstante Marke :: Series" Fehler wenn ich versuche, eine erstellen neue serie, aber dann bezieht es sich auf "app/controllers/series_controller.rb: 21: in` new '", das ist diese zeile" @serie = @ brand.series.build ".

series_controller.rb

# GET /Series/new 
# GET /Series/new.json 
def new 
    @brand = Brand.find(params[:brand_id]) 
    @serie = @brand.series.build 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @serie } 
    end 
end 

nun das Merkwürdige ist, dass die Beziehung zu funktionieren scheint, Rails nicht über „Marken“ nicht eine „Serie“ Verfahren beschwert haben. Aber die tatsächliche Erstellung des Serienobjekts scheint zu scheitern: s

Antwort

1

In Ihrer has_many Beziehung in Brand verwenden Sie ein Symbol, das den Pluralnamen Ihres Modells darstellt (wie es sein sollte). Rails muss jetzt die richtige Modellklasse von diesem Symbol finden. Um das zu tun, es grob macht folgendes:

relation_name = :series # => :series 
class_name = relation_name.singularize.classify # => "Series" 
class_object = class_name.constantize # in the context of the Brand class: => Brand::Series 

So der Täter liegt in Rails singularize Verfahren nicht in der Lage zu sein, die „richtige“ Singularform von series zu bekommen. Wenn alles so gelaufen wäre, wie Sie es erwartet haben, wäre class_name"Serie" gewesen (notieren Sie die fehlenden s am Ende).

Glücklicherweise können Sie Schienen anweisen, einen bestimmten Klassennamen für die Beziehung zu verwenden. Also ändern Sie einfach Ihre Brand Klasse in diese und Sie werden ganz gut:

class Brand < ActiveRecord::Base 
    has_many :series, :class_name => "Serie", :order => "name, id ASC", :dependent => :destroy 
end 
+0

Wow, danke, dass es löst! Jetzt verstehe ich auch, warum meine Umbenennungen schief gelaufen sind: Ich habe gerade etwas vor 'Serien' hinzugefügt (wie 'product_series' ... Ich denke, als nicht-englischer Muttersprachler habe ich einfach nicht daran gedacht, dass der Singular von "Serie" ist eigentlich "Serie" – Berggeit

Verwandte Themen