2012-03-24 10 views
1

Rails 3.2.1に問題があります。ネストされたリソースは初期化されていない定数について不平を言っています。これが機能した別のモデルと同じです。いくつかの時点で私は私が...どこかに予約語を使用しますが、モデル名は助けにはならなかった変えるかもしれないと思ったRails 3.2、ネストされたリソース、初期化されていない定数

エラー:

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 

ブランド/ show.html.erb

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

私が作成しようとすると、私は同じ "初期化されていない一定のブランド::シリーズ" のエラーが表示されますnew serieですが、 "app/controllers/series_controller.rb:21:` new '"という行です。この行は" @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 

は今、奇妙なことは、Railsは、「ブランド」、「シリーズ」の方法を持っていない文句を言っていない、関係が動作するように思われることです。しかし、実際のシリーズオブジェクトの作成は失敗しているようです。■

答えて

1

has_manyの関係では、Brandには、モデルの複数形の名前を表す記号を使用する必要があります。 Railsはそのシンボルから適切なモデルクラスを見つける必要があります。これを行うには、それは大きく以下のん:

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 

だから、犯人はseriesの「適切な」単数形を取得することができないのRails singularize方法にあります。予想どおりにすべてがうまくいく場合、class_name"Serie"(最後にはsが見つからないことに注意してください)でした。

あなたのおかげで、あなたは、関係に指定されたクラス名を使用するように、レールに指示できます。ですので、Brandクラスをこれに変更すると、うまくいくでしょう:

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

うわーありがとう!今、私の名前変更が間違っていた理由を理解しています:「シリーズ」の前に何かを追加しました(「product_series」のように...私は非母国語のスピーカーで、 「シリーズ」の実際は「シリーズ」です – Berggeit

関連する問題