Mongo Mapper をつかったサイトを Rails 4.0 にした
とあるサイトを思い立って、Rails 4.0 にアップグレードしました。 久しぶりすぎて、MongoDB (MongoHQ) を使っていることを忘れていたため、かなり軽い気持ちではじめましたが、これがなかなか。。
Rails 3.2.12を4.0.0にアップグレードした - 平凡なエンジニアの独り言
Installation in Rails 3 // MongoMapper
この辺を参考にして。
一般的なRailsのアップグレードで開発環境を立ち上げる
rake rails:update したり、config/routes.rb の match をpost/get に変更したり。
MongoMapperの対応
開発環境を立ち上げてみると、MongoMapperのコネクションエラー。 調べてみると、 stable なRails4 版はまだないんですね。。
MongoMapperのバージョンを指定
ベータ版を指定します。
gem 'mongo_mapper', :git => "git://github.com/mongomapper/mongomapper.git", :tag => "v0.13.0.beta2"
active_recordをはずす
config/application.rb の冒頭でrails 全てではなく、active_recordをのぞいてロードするように変更
require File.expand_path('../boot', __FILE__) require "action_controller/railtie" require "action_mailer/railtie" #require "active_resource/railtie" require "sprockets/railtie" require "rails/test_unit/railtie" require "image_size" require "open-uri"
config/environments/development.rb にもactive_record の設定をしている箇所があるので、変更
# Raise an error on page load if there are pending migrations # config.active_record.migration_error = :page_load
mongo.rb を削除
自動的に接続するように変更になったらしい。
$ rm config/initializers/mongo.rb
mongo.yml をURI表記に変更
データベース名とかユーザー名を個別に指定する方法だと接続できませんでした。謎。
development: uri: mongodb://:@.mongohq.com:/ # database: # host: .mongohq.com # port: # user: # password:
で、クラッシュ
開発環境で立ち上がったので、本番環境にリリース。ってことでHeroku に push しました。
ほほう。。
$ heroku logs --app=xxxxx 2014-02-16T02:36:24.812184+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/articles/4fe1753f5e63882228000072/weather_chart/month host=vn.dash-news.com request_id=7d2fa4b5-e48d-463f-a1a4-3e1855cd6058 fwd="66.249.64.27" dyno= connect= service= status=503 bytes= 2014-02-16T02:35:45.610615+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path=/a/4fd0c22a5e63887908000068/month host=vn.dash-news.com request_id=66b5620e-fc6c-4616-8815-6c3384ce207f fwd="157.55.34.99" dyno= connect= service= status=503 bytes= ....
MongoMapperの接続がうまく行ってないんだろうなーとか思いながら、production.rb を確認したり、「mongomapper rails4 app crashed」で検索したり。 結局わからず、眠くなったので睡眠。
そして原因は。。
悶々とした一晩を過ごし、 rails c production を"やっと"、思いついた。。
$ rails c production /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/format.rb:46:in `check_options_validity': The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option? (ArgumentError) from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/format.rb:20:in `check_validity!' from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validator.rb:143:in `initialize' from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/with.rb:87:in `new' from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/with.rb:87:in `block in validates_with' from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/with.rb:86:in `each' from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/with.rb:86:in `validates_with' from /Users/yosiyuki/.rvm/gems/ruby-2.0.0-p353/gems/activemodel-4.0.2/lib/active_model/validations/format.rb:111:in `validates_format_of'
ArgumentError ... ^ と $ はいけませんよ。と。
$ grep -r format app/models/* app/models/article.rb: key :url, String, :required => true, :format => URI::regexp(%w(http https)) app/models/category.rb: before_validation :format_children app/models/category.rb: def format_children app/models/contact.rb: key :mail, String, :require => true, :format => /^([a-z0-9_.-]+)@(([a-z0-9.-]+\.)[a-z]{2,})$/i app/models/link.rb: key :url, String, :required => true, :format => URI::regexp(%w(http https)) app/models/link.rb: before_validation :format_categories app/models/link.rb: def format_categories app/models/source/google_currency.rb: key :currency, String, :required => true, :format => /^[a-z]{3}$/ app/models/source/google_currency.rb: key :local_currency, String, :required => true, :format => /^[a-z]{3}$/ app/models/user.rb: key :mail, String, :require => true, :format => /^([a-z0-9_.-]+)@(([a-z0-9.-]+\.)[a-z]{2,})$/i
修正したら本番環境立ち上がった。。












