ActiveRecordとリレーションシップでNameErrorを取得する
-
03-07-2019 - |
質問
1対多の関係を使用しているときに問題が発生しました。各シリーズに1つのパブリッシャーがあり、その1つのパブリッシャーに多くのシリーズがあるようにします。
これは私のパブリッシャーモデルです:
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:uninitialized constant Publisher :: Seriesの最後の行でテストが失敗します。
出版社とシリーズを保存しようとしましたが、うまくいきませんでした。セリエを1つだけにしてみましたが、同じエラーが発生します。
私はRailsとRubyを使い始めたばかりなので、ここでは困惑しています。私は何を間違えていますか?
解決
コメントに記載されている実際の質問に対処するには(モデルに「シリーズ」という名前を付けるにはどうすればよいですか?)、Railsの Inflector は、デフォルトの複数形化規則に対するこの例外を認識しています。
以下を config / environment.rb
に追加します:
ActiveSupport::Inflector.inflections do |inflect|
inflect.uncountable 'series'
end
これにより、モデルに Series
という名前を付けることができます。 script / console
を使用して動作することをテストできます:
>> "series".pluralize #=> "series"
>> "series".singularize #=> "series"
&#8212; Pluralizer とそれを使用してみたところです。 Railsには組み込みの series という単語の処理方法に関する知識があるように見えます。 お試しください。
他のヒント
ジョンの答えが最高だと思います。
has_many宣言でクラス名を直接指定することもできます
has_many :series, :class_name => 'Serie'
has_many関係名は問題ありませんが、モデル名が間違っています。
シリーズの単数形と複数形はどちらもシリーズなので、モデルの名前をSerieからSeriesに変更する必要があります。その後、すべてが正常になります。