【问题标题】:Rails with Mongo Mapper带有 Mongo Mapper 的 Rails
【发布时间】:2011-06-02 21:22:39
【问题描述】:

事实证明,这是学习 Rails 最糟糕的一天。已经无法连接和配置到 sqlite3、mysql 数据库我转向 mongo mapper 并面临同样的问题。当我尝试启动 rails 服务器时,我得到以下信息:

/usr/local/lib/ruby/gems/1.8/gems/activesupport-3.0.7/lib/active_support/dependencies.rb:239:in `require': no such file to load -- mongo_mapper (LoadError)

我已经安装了 mongo_mapper gem,但是当我执行“which mongo_mapper”时,它不会返回任何东西。

这是我放在初始化程序文件夹中的 mongo_config.rb 文件:

require "rubygems"
require "mongo_mapper"

MongoMapper.database = "blog-#{Rails.env}"

更新1:

我改成如下:

require "rubygems"
include MongoMapper

MongoMapper.database = "blog-#{Rails.env}"

现在我收到以下错误:

   /Users/azamsharp/Projects/railsprojects/blog/config/initializers/mongo_config.rb:2: uninitialized constant MongoMapper (NameError)

【问题讨论】:

  • 与其放弃 sqlite3 和 mysql,不如再试一次。它们是最简单的数据库,而 NoSQL 只是增加了组合的复杂性。只是一个建议。
  • 在过去的 5 个小时里,我一直在尝试让 rails 服务器启动,但仍然没有成功。我正在使用 Rails 3.0.7。这是线程=> stackoverflow.com/questions/6217602/…
  • Yagooar 下面的回答解决了我的问题,你不想接受它作为解决方案吗?

标签: ruby-on-rails mongodb


【解决方案1】:

您必须将 bundler 与 rails 3 一起使用。不要试图不使用它。将以下内容添加到您的 Gemfile

source 'http://gemcutter.org'
source 'http://rubygems.org'

gem "rails", "3.0.7"
gem 'bson', "1.1.1"
gem 'bson_ext', "1.1.1"
gem 'mongo_mapper'

然后运行

bundle install

那么rails server 就可以了

【讨论】:

    【解决方案2】:

    为了让 mongo_mapper 在 Rails 中工作(在 Rails 3.1 下测试,也应该在 Rails 3.0.x 中工作),您必须遵循以下步骤:

    1. 在 Gemfile 中,添加 mongo_mapper 和 bson gem:

      gem 'mongo_mapper'
      gem 'bson_ext'
      
    2. 运行捆绑安装

    3. 在 config/ 目录下,创建一个像这样的 mongo.yml 文件:

      # config/mongo.yml
      
      defaults: &defaults
        host: 127.0.0.1
        port: 27017
      
      development:
        <<: *defaults
        database: db_development
        username: user
        password: password
      
      test:
        <<: *defaults
        database: db_test
      
      # set these environment variables on your prod server
      production:
        <<: *defaults
        database:
        username:
        password:
      
    4. 在 config/initializers 目录中,创建一个 mongo.rb 文件,如下所示:

       # config/initializers/mongo.rb
      
       #include MongoMapper
      
       db_config = YAML::load(File.read(File.join(Rails.root, "/config/mongo.yml")))
       #
       if db_config[Rails.env] && db_config[Rails.env]['adapter'] == 'mongodb'
         mongo = db_config[Rails.env]
         MongoMapper.connection = Mongo::Connection.new(mongo['host'] || 'localhost',
                                                    mongo['port'] || 27017,
                                                   :logger => Rails.logger)
         MongoMapper.database = mongo['database']
      
         if mongo['username'] && mongo['password']
           MongoMapper.database.authenticate(mongo['username'], mongo['password'])
         end
       end
      
       # Used for image uploads
       # CarrierWave.configure do |config|
       #   mongo = db_config[Rails.env]
       #   config.grid_fs_database = mongo['database']
       #   config.grid_fs_host = mongo['host'] || 'localhost'
       #   config.grid_fs_access_url = "gridfs"
       #   config.grid_fs_username = mongo['username']
       #   config.grid_fs_password =  mongo['password']
       # end
      
       # It's also possible to define indexes in the the model itself; however,
       # a few issues are being worked out still. This is a temporary solution.
       # Comment.ensure_index([["story_id", 1], ["path", 1], ["points", -1]])
       # MongoMapper.ensure_indexes!
      
       # Handle passenger forking.
       # if defined?(PhusionPassenger)
       #    PhusionPassenger.on_event(:starting_worker_process) do |forked|
       #      MongoMapper.database.connect_to_master if forked
       #    end
       # end
      
       if defined?(PhusionPassenger)
          PhusionPassenger.on_event(:starting_worker_process) do |forked|
            MongoMapper.connection.connect if forked
          end
       end
      
    5. 在启动 rails 服务器之前先启动 mongod 服务器,尽情享受吧!

    【讨论】:

    • +1 不错。但是我,还是mongo.yml 配置缺少adapter: mongodb 配置?我个人把它放在defaults: 下。
    【解决方案3】:

    尝试删除需要的行并将其替换为include MongoMapper

    【讨论】:

    • 我没有使用 bundle install 我使用 sudo gem install mongo_mapper 手动安装了 mongo_mapper gem。
    • 你为什么不使用捆绑器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多