Rails 3.1 mongodb学習ノートを使ったmongo_maper

9621 ワード

公式サイトの提示により以下の手順で順次行いますが、公式サイトの紹介記事はmongo_mapperしかし、私はネットで資料を調べたとき、多くの人がmongoidをお勧めしていることに気づきました.勉強に基づいて、もっと勉強しても悪くないと思って、無理にやってみました.数日後にmongoidを試してみました.
レールのインストール
gem install rails

アプリケーションの構成
重要なステップはこのactive-recordをスキップすることです
rails new project_name --skip-active-record

前のステップを行わずにrailsプロジェクトを直接作成した場合はconfig/application.rbファイルを変更できます.

#  require "rails/all" #    

#     
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"

同時にgenerateコマンドがオブジェクトに関連付けられていないことを確認します.义齿
# Configure generators values. Many other options are available, be sure to check the documentation.
# config.generators do |g|
#   g.orm             :active_record
#   g.template_engine :erb
#   g.test_framework  :test_unit, :fixture => true
# end

gem初期化データベースのインストール
Gemfileに追加
source 'http://gemcutter.org'
require 'rubygems'
require 'mongo'
gem "rails", "3.1.0"
gem "mongo_mapper"

次に命令インストールgemを実行します
bundle install

プロンプトにbundleがない場合はインストールしてください
gem install bundle

データベース:
ファイルconfig/initializers/mongo.rbの作成内容:

MongoMapper.connection = Mongo::Connection.new('localhost', 27017)
MongoMapper.database = "project_name_#{Rails.env}"

if defined?(PhusionPassenger)
   PhusionPassenger.on_event(:starting_worker_process) do |forked|
     MongoMapper.connection.connect if forked
   end
end

構成のテスト
ファイルlib/tasks/mongo.rakeを作成してコンテンツを追加します.
namespace :db do
  namespace :test do
    task :prepare do
      # Stub out for MongoDB
    end
  end
end

--------------------------------------------------------------------
途中で発生した問題と解決過程
問題1、railsを実行し、エラーメッセージが表示されます.
**Notice: C extension not loaded. This is required for optimum MongoDB Ruby driver performance.
  You can install the extension as follows:
  gem install bson_ext

  If you continue to receive this message after installing, make sure that the
  bson_ext gem is in your load path and that the bson_ext and mongo gems are of the same version.

gems/ruby-1.9.2-p180/gems/execjs-1.3.0/lib/execjs/runtimes.rb:50:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
	from /home/chinacheng/.rvm/gems/ruby-1.9.2-p180/gems/execjs-1.3.0/lib/execjs.rb:5:in `<module:ExecJS>'
	from /home/chinacheng/.rvm/gems/ruby-1.9.2-p180/gems/execjs-1.3.0/lib/execjs.rb:4:in `<top (required)>'

ヒントgemパッケージが見つかりません
 gem install bson_ext

インストール後、再実行しても、上記のエラーが発生します.
Gemfileに追加
gem "bson_ext"

実行rails
**Notice:C extension not loadedこの問題は存在しません
JavaScript runtimeというエラーが残っていますが、原因を調べてみました.
WindowsではデフォルトでJavascriptエンジンがあるので、Windowsではこのエラーは発生しません.Linuxでこのエラーが発生したのは、一般的に最初のプロジェクトだけがインストールされ、以降のプロジェクトは繰り返しインストールされません.
そしてこのエラーはdevelopment環境のassetsパッケージによって引き起こされたので、コメントしてください.

# Gems used only for assets and not required
# in production environments by default.
#group :assets do
#  gem 'sass-rails', "  ~> 3.1.0"
#  gem 'coffee-rails', "~> 3.1.0"
#  gem 'uglifier'
#end

「execjs」と「therubyracer」をインストールする必要はありません.
もちろんこれはいい方法ではありません
注記しない場合はGemfileに追加する必要があります

gem 'therubyracer'
gem 'execjs'

またはNode.jsをインストールします
問題2:プロファイル内のhashの問題
ps:hashについて、仕事のせいで、私の地元にはruby 1.8とruby 1.9があります.
このconfig/initializers/wrap_parameters.rbファイルはruby 1.8.7で次のエラーが発生します.
 syntax error, unexpected ':', expecting kEND (SyntaxError)
  wrap_parameters format: [:json]

これはruby 1.9.2環境では問題ありません
1.8環境での変更が必要
wrap_parameters :format=>[:json]

またセッション_store.rbというファイルでもこのような問題が発生します.
 
syntax error, unexpected ':', expecting $end (SyntaxError)
...ion_store :cookie_store, key: '_project_name_session'

同じ理屈で1.9で大丈夫ですが、1.8ではkey=>'_に変更します.project_name_session'
上記の問題で際立った問題は、ruby 1.8がruby 1.9のhash定義に現れる変化である.
#新しい構文
h = { a: 1, b: 2 }# 

#古い構文
h = { :a=> 1, :b=>2 }#   {:a=>1, :b=>2}

1.9.2以前の1.8.7の書き方と同時に対応
----------------------------------------------------------------------------
次はそのデモを続けます
まずはトップページの表示をします
運転指令
rails g controller index

Indexのコントローラおよびその他のコードの作成
先書きテスト
コントローラのテストファイルに追加
 require 'test_helper'
 class IndexControllerTest < ActionController::TestCase
   test "access the index page" do
      get :index
      assert_response 200
   end
 end

実行して、きっと走って通じないで、コードを書いて機能を実現します
publicの下にあるindex.htmlファイルを削除
次のルーティングを構成し、新しいホームパスを指定します.
root :to=>'index#index'

IndexControllerでのホームアクションの追加
  class IndexController < ApplicationController
     def index
     end
  end

app/view/index/下にindex.erbファイルを追加
rake testを実行し、エラーを表示
test_helper.rb:3:in `<class:TestCase>': undefined method `fixtures' for ActiveSupport::TestCase:Class (NoMethodError)

これはテスト例の問題です.
test_をhelper.rbでテスト用例を呼び出すコードコメント
# fixtures :all

テストレイクテストの再実行
IndexControllerTest
     PASS test_access_the_index_page (0:00:00.334)
Finished in 0.335200 seconds.
1 tests, 1 passed, 0 failures, 0 errors, 0 skips, 1 assertions

ホームページにアクセスできました
ps:上のコントロールは基本的にmongoとは関係ありませんが、機能テストに合格したfixturesはこれを載せました.
モデル#モデル#
userというmodelを作成する:コマンドを実行する
rails g model topic --skip-migration  --orm=mongo_mapper

ormこのパラメータを書かないと、このエラーが発生します.
No value provided for required options '--orm'

実行が完了すると、生成されたファイルが表示されます.
      invoke  mongo_mapper
      create    app/models/user.rb
      invoke    test_unit
      create      test/unit/user_test.rb
      create      test/fixtures/users.yml

毎回これを書きたくないなら--orm
config/application.rbに追加:
config.generators do |g|
  g.orm :mongo_mapper
end

user.rbコード

class User
  include MongoMapper::Document
  key :name, String
  key :age, Integer
end

user_test.rbコード
# encoding: utf-8
require 'test_helper'

class UserTest < ActiveSupport::TestCase
  test "new user test" do
    assert_equal User.count,0
    assert_difference "User.count",1 do
      User.create(:name=>"  ",:age=>18)
    end
    user = User.last
    assert_equal user.name, "  "
    assert_equal user.age, 18
  end

ユニットテストの実行
rake test:unitsエラー検出
Errors running test:units!
スタック情報の表示

** Invoke test:units (first_time)
** Invoke test:prepare (first_time)
** Invoke db:test:prepare (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:test:prepare
rake aborted!
Set config before connecting. MongoMapper.config = {...}

ヒントリンクの前に設定:
project_name$ script/rails generate mongo_mapper:config
      create  config/mongo.yml

このプロファイルの内容は次のとおりです.

development:
  host: 127.0.0.1
  port: 27017
  database: project_name_development

test:
  host: 127.0.0.1
  port: 27017
  database: project_name_test

# set these environment variables on your prod server
production:
  host: 127.0.0.1
  port: 27017
  database: project_name
  username: <%= ENV['MONGO_USERNAME'] %>
  password: <%= ENV['MONGO_PASSWORD'] %>

rake test;unitsは大丈夫です
UserTest
     PASS test_new_user_test (0:00:00.333)

Finished in 0.469750 seconds.

1 tests, 1 passed, 0 failures, 0 errors, 0 skips, 4 assertions

またusers_も書かれていますControllerの削除この検索とそのテストは、mysqlに関連する書き方と何の違いもなく、まったく同じです.
テスト項目のソースアドレス
https://github.com/chinacheng/mongodb_project