2009-04-30 6 views
0

1対多リレーションシップを使用するときに問題が発生しました。私は、各シリーズに1つの出版社があり、1つの出版社に多くのシリーズがあるようにしたいと考えています。ActiveRecordとリレーションシップでNameErrorを取得する

これは私の出版社のモデルである:

class Publisher < ActiveRecord::Base 
    validates_presence_of :name 
    has_many :series 
end 

これは私のセリエモデルです:

class Serie < ActiveRecord::Base 
    belongs_to :publisher 
end 

これが失敗するテストです:

test "a publisher should have a list of series" do 
    @publisher = Publisher.new :name => "Standaard Uitgeverij" 
    @series = [ Serie.new(:name => "De avonturen van Urbanus", :publisher => @publisher), 
       Serie.new(:name => "Suske en Wiske", :publisher => @publisher) ] 
    assert_equal @series, @publisher.series 
end 

テストが最後の行に失敗しましたNameError:初期化されていない定数Publisher :: Series。

パブリッシャーとシリーズを保存しようとしましたが、これは機能しませんでした。私は1つのセリで試しましたが、これは同じエラーを与えます。

私はRailsとRubyを使い始めているので、ここでは紛失しています。私は間違って何をしていますか?あなたのコメントで述べたように、あなたの実際の質問に対処するために

+0

has_many関係の名前をserieに変更し、シリーズを保存するときに関係が機能します。しかし、私はセリエの代わりに名前シリーズを持っていたい。 –

答えて

1

がどのように私は私のモデル「シリーズ」?に名前を付けることができます)、あなたはそのデフォルトの複数形のルールにこの例外のRailsのInflector認識させる必要があります。

config/environment.rbに以下を追加します。

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.uncountable 'series' 
end 

これは、あなたがSeriesとしてモデルに名前を付けるようになります。あなたはそれがscript/consoleを使用して働いていますことをテストすることができます。

>> "series".pluralize #=> "series" 
>> "series".singularize #=> "series" 

—私はちょうどThe Pluralizerを使用してみました、Railsが単語シリーズビルトインをどのように扱うかについての知識を持っているように思われることを言わなければなりません。 Try it for yourself

+0

モデル名はSerie(単数)ですが、Publisherモデルで使用したい名前はシリーズ(複数)です。 –

+0

私はそれを理解していますが、モデル名はシリーズでなければなりません。なぜならそれはSeriesという単語の正しい単数形であるからです。 –

+0

ああ、正しい。ありがとう。それは今私が望むように動作します。 –

1

私はジョンの答えは最高のものだと思います。

ます。また、直接

has_many :series, :class_name => 'Serie' 
+0

私はちょうどこの答えを投稿しようとしていました。しかし、私のコードがなぜ受け入れられないのかは説明していません。私によれば、このコードは規約に従っています。私はむしろそこにclass_nameを含まないだろう。 –

1

has_manyの宣言でクラス名を指定することができますあなたにhas_many関係名は結構ですが、あなたのモデル名が間違っています。

シリーズの単数形と複数形が両方ともシリーズであるため、モデルの名前をSerieからSeriesに変更する必要があります。その後、すべてがうまくいくはずです。

関連する問題