質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

470閲覧

railsで自作ライブラリとモデル名が競合している場合の対処方法

pomme

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/10/07 08:22

編集2017/10/07 13:34

###前提・実現したいこと
Rails初心者です.初歩的な質問ですが,ご容赦ください.
railsで自作ライブラリを使うため,以下のサイトを参考に対応しています.
https://qiita.com/azusanakano/items/885fe3236977580b00c9
自作ライブラリで利用しているクラス名と同名のModelをscaffoldで作成しました.
Model用のクラスを呼び出すと以下エラーが発生します.
対処方法についておしえてください.
(別名にすれば問題ないのですが,同名を利用する場合の対応方法について把握したい,
名付けの観点で同名にするのがモデルを表す用途で適切である,という理由で質問させていただきます)

###発生している問題・エラーメッセージ

LoadError: Unable to autoload constant Foo, expected /path to/app_name/lib/mylib/foo.rb to define it

###該当のソースコード
以下,方法にて事象再現可能だと思います.Railsバージョンは5.1.4です.
1 以下コマンドを実行する.

$ rails new footest $ cd footest $ mkdir lib/mylib $ vi lib/mylib/foo.rb

2 以下内容のfoo.rbを作成する.

ruby

1module Mylib 2 class Foo 3 attr_reader :name 4 5 def initialize name 6 @name = name 7 end 8 end 9 10 def self.get_foos 11 12 end 13end

3 config/application.rbのclass Application内にconfig.autoload_pathsの行を追加する.

ruby

1module Footest 2 class Application < Rails::Application 3 # Initialize configuration defaults for originally generated Rails version. 4 config.load_defaults 5.1 5 6 # Settings in config/environments/* take precedence over those specified here. 7 # Application configuration should go into files in config/initializers 8 # -- all .rb files in that directory are automatically loaded. 9 10 config.autoload_paths += %W(#{config.root}/lib/mylib) #追記 11 end 12end

4 以下コマンドを実行する.

$ rails generate scaffold Foo name:string $ rails db:migrate

5 db/seeds.rbに以下内容を記載する.

ruby

1require 'foo' 2 3a = Mylib::Foo.new("foo") 4puts a.name 5Foo.create(:name => a.name)

6 以下コマンドを実行すると,エラーが発生します.

$ rails db:seed foo rails aborted! LoadError: Unable to autoload constant Foo, expected /path_to/footest/lib/mylib/foo.rb to define it /path_to/footest/db/seeds.rb:13:in `<top (required)>' /path_to/footest/bin/rails:9:in `require' /path_to/footest/bin/rails:9:in `<top (required)>' /path_to/footest/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => db:seed (See full trace by running task with --trace)

###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suzukis

2017/10/07 12:36

コードは現象が再現できるものを記載してください
pomme

2017/10/07 13:35

ご連絡ありがとうございます.更新した内容にて再現可能かと思います.
guest

回答2

0

::Fooと、完全修飾のクラス名で呼んでみたら、どうなりますでしょうか。、

投稿2017/10/07 08:29

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pomme

2017/10/07 08:33

ご回答ありがとうございます. ::Fooとしてみませんたが,エラー内容に変化はありませんでした.
guest

0

ベストアンサー

autoloadで期待されるクラス名とファイルのパスが一致してないのでエラーになっています。

Fooを参照する→autoload_pathsからfoo.rbを検索する→lib/mylib/foo.rbが見つかる→Fooが定義されてないのでエラー

参考サイトの通り

config.autoload_paths += %W(#{config.root}/lib)

にしてください。また、require 'foo'は不要です。

投稿2017/10/08 05:50

suzukis

総合スコア1449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pomme

2017/10/08 13:13

ありがとうございます.ご指摘の内容で解決しました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問