Ringo-Tabbetterで Padrino 0.11.2 の対応してみた

最近ニュージーランド産の新しいリンゴを食べたため、それらを追加するついでにPadrino0.11.2対応をしてみたところ、ActiveRecordまわりでハマったため、それらのメモ。

■最終的な環境

■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"


以上で新しいリンゴが表示されるようになりました。