This assumes you have RVM Setup like I do.
I will typically start a new project off like so to create a new rails app (courtesy of RailsApps’ Rails Composer), where you can select such options as MongoDB (!):
cd ~/railsprojects mkdir palette cd palette rvm use ruby-2.0.0@palette --ruby-version --create gem install rails rails new . -m https://raw.github.com/RailsApps/rails-composer/master/composer.rb -T -O cd . git add . git commit -m "Initial rails generation" rails s
Remove traces of mongoid from everywhere you find it… Might even be a file under spec/support/mongoid.rb
Add this to your Gemfile (as of March 2014, still need the beta tag for Rails4):
gem 'mongo' gem 'mongo_mapper', :git => "git://github.com/mongomapper/mongomapper.git", :tag => "v0.13.0.beta2" gem 'bson_ext'
In case you didn’t skip Active Record (-O
), you might have to make the following changes in the config/application.rb
file. Remove:
require 'rails/all'
And replace it with:
# Pick the frameworks you want: # require "active_record/railtie" require "action_controller/railtie" require "action_mailer/railtie" # require "active_resource/railtie" require "sprockets/railtie" # require "rails/test_unit/railtie"
And configure some generators (and add the gems to your Gemfile):
config.generators do |g| g.orm :mongo_mapper # :active_record g.template_engine :erb # :haml g.test_framework :rspec, :fixture => true, :views => false g.fixture_replacement :factory_girl, :dir => "spec/factories" end
I like to use cucumber, rspec, factory girl or fabricator… RailsComposer should have set these up for you.
If you chose to use cucumber, your features/support/env.rb
might have a reference to mongoid
that needs to look like this instead:
# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead. begin DatabaseCleaner[:mongo_mapper].strategy = :truncation rescue NameError raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it." end
If you have an existing rails app with Active Record, you may have to comment out some other settings:
config/environments/development.rb
#config.active_record.mass_assignment_sanitizer = :strict #config.active_record.auto_explain_threshold_in_seconds = 0.5
config/application.rb
#config.active_record.whitelist_attributes = true
Run
bundle install
Run the initializer:
rails g mongo_mapper:config
Which should create a config/mongodb.yml
file (be sure to use your project name in place of palette
), that should look something like this:
defaults: &defaults host: 127.0.0.1 port: 27017 options: w: 1 pool_size: 1 slave_ok: false ssl: false development: <<: *defaults database: palette-development host: localhost logger: mongo test: &test <<: *defaults database: palette-test host: localhost production: <<: *defaults uri: <%= ENV['MONGOHQ_URL'] %> database: palette username: <%= ENV['MONGO_USERNAME'] %> password: <%= ENV['MONGO_PASSWORD'] %>
Add config/initializers/mongomapper.rb
# MongoMapper logging: control by 'logname' option in mongodb.yml # if logname option omitted or set to 'none', disable logging. # if logname set to 'rails' or 'default', use MongoMapper default log. # otherwise, log to file log/_.log logname = MongoMapper.config[Rails.env]['logger'] if logname.nil? || logname == 'none' MongoMapper.connection.instance_variable_set(:@logger, nil) elsif logname != 'rails' && logname != 'default' logger = Logger.new(File.join(Rails.root, "/log/#{logname}_#{Rails.env}.log"), 'daily') logger.formatter = Logger::Formatter.new logger.datetime_format = "%H:%M:%S %Y-%m-%d" MongoMapper.connection.instance_variable_set(:@logger, logger) end # setup MongoMapper connection unless Rails app has already done so unless MongoMapper::Connection.class_variables.include?(:@@database_name) env = ENV['RAILS_ENV'] || 'development' config_file = "#{File.dirname(__FILE__)}/../mongodb.yml" MongoMapper.config = YAML.load(ERB.new(File.read(config_file)).result) MongoMapper.setup MongoMapper.config, env, :pool_size => 30, :pool_timeout => 5 end #@@gridfs = Mongo::Grid.new(MongoMapper.database, 'attachments') puts "Initialized: #{MongoMapper.database.name}"
I also have a config/initializers/mongodb.rb
file:
# Set up database name, appending the environment name # (e.g., palette-development, palette-production) MongoMapper.config = { Rails.env => { 'uri' => ENV['MONGOHQ_URL'] || 'mongodb://localhost/xxxxxxxx' } } MongoMapper.connect(Rails.env) name = "palette-#{Rails.env}" if ENV['MONGOHQ_URL'] uri = URI.parse(ENV['MONGOHQ_URL']) name = uri.path.gsub(/^//, '') puts "Env = #{ENV['MONGOHQ_URL']}; DB NAME: #{name}" end MongoMapper.database = "#{name}"
Now start things up in a couple of terminal windows:
mongod
And I like to run rspec
and cucumber
to be sure they are properly set up, and then run the rails server:
rspec cucumber rails s
Now would be a good time to commit 😉
If you want to add something real, here’s a quick way to test it all out (not for production):
rails g scaffold Book author title front_cover http://localhost:3000/books
You should see a simple page where you can enter a new book!
(Note: when you go to update a book, you will need to change the controller code to be if @book.update_attributes(book_params)
to get it to work…)
That’s it!