Ruby on Railsの「uninitialized constant ~」エラーで詰まった話

Ruby on Railsでの開発中「uninitialized constant ~」というエラーが発生し詰まったので、解決した内容を備忘で残す。

「uninitialized constant ~」エラーとは

クラスの読み込みに失敗しているときに発生するエラー

ファイル名とクラス名が一致していないことが原因として多いらしい。

エラーが起きたときの状況

コードは以下のとおり。
app/controllers/xxx_controller.rb から app/parameters/xxx/xxx_create_parameter.rb を呼び出している。

#app/controllers/xxx_controller.rb
class XxxController < ApplicationController
    def create
        parameter = XxxCreateParameter.new(params)
        .
        .
        .
    end
end

#app/parameters/xxx/xxx_create_parameter.rb
class XxxCreateParameter
    def initialize(params)
        @title = params[:title]
    end
end

エラーが起きたのは、 XxxCreateParameter.new(params) で「uninitialized constant XxxController::XxxCreateParameter」と出力された。

解決方法

xxx_create_parameter.rbのパスを「app/parameters」フォルダ直下に変更すれば直った。

app/parameters/xxx/xxx_create_parameter.rb
app/parameters/xxx_create_parameter.rb

「parameters」フォルダに「xxx」フォルダを切って、そこにファイルを置いていたせいで、railsがファイルを見つけられなくなり、クラスの読み込みに失敗していたらしい。

反対に、app/parameters/xxx/xxx_create_parameter.rbを生かしたいのであれば、以下のようにコードを変更する必要がある。

#app/controllers/xxx_controller.rb
class XxxController < ApplicationController
    def create
        parameter = Xxx::XxxCreateParameter.new(params)
        .
        .
        .
    end
end

#app/parameters/xxx/xxx_create_parameter.rb
class Xxx::XxxCreateParameter
    def initialize(params)
        @title = params[:title]
    end
end

Xxx::XxxCreateParameter.new(params) のように、クラス名の前に名前空間を指定することで、正しく認識されるようになった。

おわりに

RubyというかRailsは規約が多くて大変ですね。。
この解決方法以外にもきっと色々方法があるんだろうなと思いますが、一歩一歩学習です。

コメント

タイトルとURLをコピーしました