最近ニュージーランド産の新しいリンゴを食べたため、それらを追加するついでにPadrino0.11.2対応をしてみたところ、ActiveRecordまわりでハマったため、それらのメモ。
■最終的な環境
- Ubuntu 12.04
- Ruby 1.9.3
- Padrino 0.11.2
- ActiveRecord 3.2.13
■デモ
■Padrino本体のバージョンアップ
Gemfileの記述を修正し、bundle updateでバージョンアップを行いました。
- Gemfile
gem 'padrino', "0.11.2"
■Rubyのバージョン指定
Heroku上で使用するRubyのバージョンを明確に指定するようにしました。
- Gemfile
source "https://rubygems.org" ruby "1.9.3"
参考:Specifying a Ruby Version | Heroku Dev Center
■ActiveRecord4.0に起因するエラーとその回避索
発生したエラーと流れ
バージョンアップ自体は上記で完了したため、テストとしてHeroku上のジョブとして設定してあるtaskを実行したところ、エラーが出ました。
- taskの実行
padrino rake gather_timeline
- エラー
tasks/gather_timeline.rake:8:in `block in
': uninitialized constant Tweet (NameError)
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:236:in `call'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:236:in `block in execute'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:231:in `each'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:231:in `execute'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:175:in `block in invoke_with_call_chain'
from /usr/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:168:in `invoke_with_call_chain'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:161:in `invoke'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:149:in `invoke_task'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `block (2 levels) in top_level'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `each'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `block in top_level'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:115:in `run_with_threads'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:100:in `top_level'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/lib/padrino-core/cli/base.rb:54:in `rake'
from /var/lib/gems/1.9.1/gems/thor-0.17.0/lib/thor/task.rb:27:in `run'
from /var/lib/gems/1.9.1/gems/thor-0.17.0/lib/thor/invocation.rb:120:in `invoke_task'
from /var/lib/gems/1.9.1/gems/thor-0.17.0/lib/thor.rb:344:in `dispatch'
from /var/lib/gems/1.9.1/gems/thor-0.17.0/lib/thor/base.rb:434:in `start'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/bin/padrino:9:in `'
from /usr/local/bin/padrino:19:in `load'
from /usr/local/bin/padrino:19:in `'
ソースコード自体は変更していないため探してみたところ、GithubにIssueがありました。
Broken upgrade path for ActiveRecord · Issue #1295 · padrino/padrino-framework · GitHub
0.11.xより、Rakefileに変更があったとのことで、GithubのIssue通りにRakefileの記載を変更しましたがエラーは変わらなかったため、gather_timeline.rbも修正しました。
- gather_timeline.rb
- task :gather_timeline do + task gather_timeline: :environment do
参考:Guides Rake Tasks - Padrino Ruby Web Framework
再度「padrino rake gather_timeline」を実行したところ、今度は別のエラーが発生しました。
/var/lib/gems/1.9.1/gems/activerecord-4.0.0/lib/active_record/dynamic_matchers.rb:22:in `method_missing': undefined method `mass_assignment_sanitizer=' for ActiveRecord::Base:Class (NoMethodError)
from /home/sk/ringo-tabetter/config/database.rb:57:in `'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/lib/padrino-core/reloader.rb:137:in `require'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/lib/padrino-core/reloader.rb:137:in `safe_load'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/lib/padrino-core/loader.rb:167:in `block in require_dependencies'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/lib/padrino-core/loader.rb:165:in `each'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/lib/padrino-core/loader.rb:165:in `require_dependencies'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/lib/padrino-core/loader.rb:69:in `load!'
from /home/sk/ringo-tabetter/config/boot.rb:47:in `'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/lib/padrino-core/cli/rake_tasks.rb:13:in `require'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/lib/padrino-core/cli/rake_tasks.rb:13:in `block in'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:236:in `call'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:236:in `block in execute'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:231:in `each'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:231:in `execute'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:175:in `block in invoke_with_call_chain'
from /usr/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:168:in `invoke_with_call_chain'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:197:in `block in invoke_prerequisites'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:195:in `each'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:195:in `invoke_prerequisites'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:174:in `block in invoke_with_call_chain'
from /usr/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:168:in `invoke_with_call_chain'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/task.rb:161:in `invoke'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:149:in `invoke_task'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `block (2 levels) in top_level'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `each'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:106:in `block in top_level'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:115:in `run_with_threads'
from /var/lib/gems/1.9.1/gems/rake-10.1.0/lib/rake/application.rb:100:in `top_level'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/lib/padrino-core/cli/base.rb:54:in `rake'
from /var/lib/gems/1.9.1/gems/thor-0.17.0/lib/thor/task.rb:27:in `run'
from /var/lib/gems/1.9.1/gems/thor-0.17.0/lib/thor/invocation.rb:120:in `invoke_task'
from /var/lib/gems/1.9.1/gems/thor-0.17.0/lib/thor.rb:344:in `dispatch'
from /var/lib/gems/1.9.1/gems/thor-0.17.0/lib/thor/base.rb:434:in `start'
from /var/lib/gems/1.9.1/gems/padrino-core-0.11.2/bin/padrino:9:in `'
from /usr/local/bin/padrino:19:in `load'
from /usr/local/bin/padrino:19:in `'
ActiveRecordに起因するエラーのように見えたので、今度はActiveRecord関係のエラーを探したところ、以下のIssueがありました。
activerecord 4.0.0 undefined method mass_assignment_sanitizer · Issue #1333 · padrino/padrino-framework · GitHub
ActiveRecord4.xで発生するとのことで、対応としてはPadrinoのコードを直せばよいとのことでした。
ただ、ActiveRecordのソースは変更したくないため、ActiveRecordのバージョンを 3.2.13 へと切り替えてみたところ、上記のエラーは出なくなりました。
現時点ではIssueがOpenしていることから、とりあえずはこの対応でよしとしました。
修正した箇所のまとめ
今回は3ヶ所の修正を行いました。
以下の内容に変えました。
require 'bundler/setup' require 'padrino-core/cli/rake' PadrinoTasks.use(:database) PadrinoTasks.use(:activerecord) PadrinoTasks.init
- tasks/gather_timeline.rb
- task :gather_timeline do + task gather_timeline: :environment do
- Gemfile
ActiveRecordのバージョンを指定しました。
gem 'activerecord', "3.2.13", :require => "active_record"
以上で新しいリンゴが表示されるようになりました。