Rails 3.1 mongodb学習ノートを使ったmongo_maper
公式サイトの提示により以下の手順で順次行いますが、公式サイトの紹介記事はmongo_mapperしかし、私はネットで資料を調べたとき、多くの人がmongoidをお勧めしていることに気づきました.勉強に基づいて、もっと勉強しても悪くないと思って、無理にやってみました.数日後にmongoidを試してみました.
レールのインストール
アプリケーションの構成
重要なステップはこのactive-recordをスキップすることです
前のステップを行わずにrailsプロジェクトを直接作成した場合はconfig/application.rbファイルを変更できます.
同時にgenerateコマンドがオブジェクトに関連付けられていないことを確認します.义齿
gem初期化データベースのインストール
Gemfileに追加
次に命令インストールgemを実行します
プロンプトにbundleがない場合はインストールしてください
データベース:
ファイルconfig/initializers/mongo.rbの作成内容:
構成のテスト
ファイルlib/tasks/mongo.rakeを作成してコンテンツを追加します.
--------------------------------------------------------------------
途中で発生した問題と解決過程
問題1、railsを実行し、エラーメッセージが表示されます.
ヒントgemパッケージが見つかりません
インストール後、再実行しても、上記のエラーが発生します.
Gemfileに追加
実行rails
**Notice:C extension not loadedこの問題は存在しません
JavaScript runtimeというエラーが残っていますが、原因を調べてみました.
WindowsではデフォルトでJavascriptエンジンがあるので、Windowsではこのエラーは発生しません.Linuxでこのエラーが発生したのは、一般的に最初のプロジェクトだけがインストールされ、以降のプロジェクトは繰り返しインストールされません.
そしてこのエラーはdevelopment環境のassetsパッケージによって引き起こされたので、コメントしてください.
「execjs」と「therubyracer」をインストールする必要はありません.
もちろんこれはいい方法ではありません
注記しない場合はGemfileに追加する必要があります
またはNode.jsをインストールします
問題2:プロファイル内のhashの問題
ps:hashについて、仕事のせいで、私の地元にはruby 1.8とruby 1.9があります.
このconfig/initializers/wrap_parameters.rbファイルはruby 1.8.7で次のエラーが発生します.
これはruby 1.9.2環境では問題ありません
1.8環境での変更が必要
またセッション_store.rbというファイルでもこのような問題が発生します.
同じ理屈で1.9で大丈夫ですが、1.8ではkey=>'_に変更します.project_name_session'
上記の問題で際立った問題は、ruby 1.8がruby 1.9のhash定義に現れる変化である.
#新しい構文
#古い構文
1.9.2以前の1.8.7の書き方と同時に対応
----------------------------------------------------------------------------
次はそのデモを続けます
まずはトップページの表示をします
運転指令
Indexのコントローラおよびその他のコードの作成
先書きテスト
コントローラのテストファイルに追加
実行して、きっと走って通じないで、コードを書いて機能を実現します
publicの下にあるindex.htmlファイルを削除
次のルーティングを構成し、新しいホームパスを指定します.
IndexControllerでのホームアクションの追加
app/view/index/下にindex.erbファイルを追加
rake testを実行し、エラーを表示
これはテスト例の問題です.
test_をhelper.rbでテスト用例を呼び出すコードコメント
テストレイクテストの再実行
ホームページにアクセスできました
ps:上のコントロールは基本的にmongoとは関係ありませんが、機能テストに合格したfixturesはこれを載せました.
モデル#モデル#
userというmodelを作成する:コマンドを実行する
ormこのパラメータを書かないと、このエラーが発生します.
実行が完了すると、生成されたファイルが表示されます.
毎回これを書きたくないなら--orm
config/application.rbに追加:
user.rbコード
user_test.rbコード
# encoding: utf-8
require 'test_helper'
ユニットテストの実行
rake test:unitsエラー検出
Errors running test:units!
スタック情報の表示
ヒントリンクの前に設定:
このプロファイルの内容は次のとおりです.
rake test;unitsは大丈夫です
またusers_も書かれていますControllerの削除この検索とそのテストは、mysqlに関連する書き方と何の違いもなく、まったく同じです.
テスト項目のソースアドレス
https://github.com/chinacheng/mongodb_project
レールのインストール
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