Rails3で開発されたRestAPIをMongoDBデータベースでファイルアップロードするためにCarrierWaveを使用しようとすると、問題が発生します。
私がやりたいのは、MongoDBシステムGridFSでいくつかのファイル(画像だけでなくすべてのファイル形式)を保存することです。CarrierWavegemの使用を推奨する多くのドキュメントを読みました。
しかし、設定しようとするとエラーが発生します。
私の開発環境:Gemfile:
source 'https://rubygems.org'
gem 'rails', '3.2.8'
# MongoDB
gem 'mongoid', :git => 'git://github.com/mongoid/mongoid.git'
gem 'carrierwave', :git => "git://github.com/jnicklas/carrierwave.git"
# gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid'
gem 'mini_magick', :git => 'git://github.com/probablycorey/mini_magick.git'
gem 'bson_ext'
gem 'json'
application.rb:
require File.expand_path('../boot', __FILE__)
# ActiveRecord will not be use with MongoDB
# require 'rails/all'
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"
require "sprockets/railtie"
require "mongoid/railtie"
require "carrierwave"
# require "carrierwave/mongoid"
私はmongoid.yml(config / mongoid.yml)ファイルでデータベースを定義します:
development:
sessions:
default:
database: lf_rest_api_development
hosts:
- localhost:27017
options:
consistency: :strong
options:
test:
sessions:
default:
database: lf_rest_api_test
hosts:
- localhost:27017
options:
consistency: :strong
そして、イニシャライザー(config / initializers / mongoid.rb)でロードします:
Mongoid.load!("config/mongoid.yml")
--最後のファイルconfig/initializers/carrierwave.rbの後で問題なく「railsserver」コマンドを実行できます。
CarrierWave.configure do |config|
config.grid_fs_database = Mongoid.database.name
config.grid_fs_host = Mongoid.config.master.connection.host
config.storage = :grid_fs
config.grid_fs_access_url = "/files"
end
そして、「rails server」コマンドを実行すると、次のエラーが発生します。
=> Booting WEBrick
=> Rails 3.2.8 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Exiting
/{API_path}/config/initializers/zcarrierwave.rb:4:in `block in <top (required)>': undefined method `database' for Mongoid:Module (NoMethodError)
[...]
私のファイルモデルは次のように定義されています:
require 'carrierwave/orm/mongoid'
class File
include Mongoid::Document
store_in_collection: "files", database: "lf_rest_api_developement", session: "default"
key :filename, type: String
key :content_type, type: String
key :length, type: BigDecimal
key :chunk_size, type: Integer, :default => 256
key :upload_date, type: DateTime
key :md5, type: String
key :metadata, type: Array, :default => []
mount_uploader :file, FileUploader
index({ location: "2d" }, { min: -200, max: 200 })
end
FileUploaderは、CarrierWaveアップローダーの単なる拡張です...
class FileUploader < CarrierWave::Uploader::Base
storage :grid_fs
end