【问题标题】:Extending Faker gem locally uninitialized constant Faker::xxx扩展 Faker gem 本地未初始化常量 Faker::xxx
【发布时间】:2012-12-22 16:10:45
【问题描述】:

我想扩展 Rails 的 faker gem 以生成其他随机日期(在我的情况下是计算机游戏名称)

#lib/extended_faker.rb
require 'faker'
require 'extended_faker/game'

#lib/extended_faker/game.rb
Module Faker
    class Game < Faker::Base
        class << self
            def name
                fetch('game.name')
            end
        end
    end
end

#config/locals/faker_en.yml
en:
  faker:
    game:
      name: ["a", "b", "c"]

#config/application.rb
...
config.autoload_paths += Dir["#{config.root}/lib/**/"]
...

然后当我在 Rails 控制台中运行它时,我得到以下信息

Loading development environment (Rails 3.2.9)
1.9.3p194 :001 > Faker::Game.name
LoadError: Expected /home/enermis/School/Projects/IG/test/lib/extended_faker/game.rb to define Game
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:503:in `load_missing_constant'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:192:in `block in const_missing'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:190:in `each'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:190:in `const_missing'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:514:in `load_missing_constant'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:192:in `block in const_missing'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:190:in `each'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.9/lib/active_support/dependencies.rb:190:in `const_missing'
    from (irb):1
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.9/lib/rails/commands/console.rb:47:in `start'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.9/lib/rails/commands/console.rb:8:in `start'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.9/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

当我将 lib/extended_faker/game.rb 文件更改为此

require 'faker'
require 'extended_faker/game'
include 'extended_faker/item'
include 'extended_faker/team'

我在控制台中出现奇怪的行为

Loading development environment (Rails 3.2.9)
1.9.3p194 :001 > Faker::Game.name
 => "b" 
1.9.3p194 :002 > Faker::Game.name
NameError: uninitialized constant Faker::Game
    from (irb):2
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.9/lib/rails/commands/console.rb:47:in `start'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.9/lib/rails/commands/console.rb:8:in `start'
    from /home/enermis/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.9/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

我不明白的奇怪之处在于,我第一次运行生成器时,我得到了一个有效的结果,但第二次我得到了一个错误......

我错过了什么?

【问题讨论】:

    标签: ruby ruby-on-rails-3 faker


    【解决方案1】:

    你应该把它放进去
    lib/faker/game.rb
    从 lib 目录开始,rails 约定是最外层的模块名称 -> in 是文件夹名称。那么实际的类/模块名就是文件名,下划线为驼峰式。
    另一个例子

    module Foo
      module Bar
        class BazParty
          def self.hello
            puts "hello"
          end
        end
      end
    end
    

    会去lib/foo/bar/baz_party.rb

    【讨论】:

    • 谢谢,这似乎确实有效。有没有办法通过名称匹配来绕过rails'magic'。同样出于好奇,我仍然想知道为什么第二种方法只有效一次。
    • require File.join(Rails.root, "lib", "extended_faker", "game.rb") 在你使用它的文件中我想。我会仔细检查。
    • 是的。这在 Rails 控制台中按预期工作。不过,我真的建议您参加会议。也许用lib/faker/ext/game.rb 然后class Faker::Ext::Game &lt; Faker::Base 或者只是调用文件夹faker - 但我想我知道你来自哪里。
    • 一个快速的“风格”提示:你可以这样做require Rails.root.join('lib', 'extended_faker', 'game.rb')
    猜你喜欢
    • 2015-02-11
    • 2012-07-14
    • 1970-01-01
    • 2015-03-13
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多