1

Rails 3.2.1 で問題が発生しています。ネストされたリソースが初期化されていない定数について不平を言い続けています。これが機能した別のモデルと同じことをしたように見えるため、理由がわかりません。ある時点で、どこかで予約語を使用している可能性があると思いましたが、モデル名を変更しても役に立ちませんでした...

エラー:

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>

ブランド.rb

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

セリエ.rb

class Serie < ActiveRecord::Base
    belongs_to :brand
end

brand_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 %>

新しいシリーズを作成しようとすると、同じ「初期化されていない定数 Brand::Series」エラーが発生しますが、「app/controllers/series_controller.rb:21:in `new'」が参照されます。この行は「@セリエ = @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は、「シリーズ」メソッドを持たない「ブランド」について不平を言っているわけではありません. しかし、シリーズオブジェクトの実際の作成は失敗しているようです:s

4

1 に答える 1

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

したがって、犯人は Rails singularizeメソッドが の「適切な」単数形を取得できないことにありseriesます。すべてが期待どおりに機能していれば、そうであったclass_nameはずです"Serie"(最後の欠落sに注意してください)。

幸運なことに、指定したクラス名をリレーションに使用するよう Rails に指示できます。したがって、Brandクラスをこれに変更するだけで問題ありません。

class Brand < ActiveRecord::Base
  has_many :series, :class_name => "Serie", :order => "name, id ASC", :dependent => :destroy
end
于 2012-03-24T10:04:54.027 に答える