@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Legacy on Rails

最近古いバージョンのRailsに触ることが多かったので、二度と使わないで済むことを祈りつつ、得た知見をメモします。

Ruby 2.4 と PostgreSQLRails 3.2

Rails 3.2 と PostgreSQLRuby 2.4で rake db:create だけコケるおもしろ現象に出会いました。

https://github.com/rails/rails/blob/1f2192e46d78ee0ba2b06373f2c24caf8440ff5b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L747

        option_string = options.symbolize_keys.sum do |key, value|
          case key
          when :owner
            " OWNER = \"#{value}\""
          when :template
            " TEMPLATE = \"#{value}\""
          when :encoding
            " ENCODING = '#{value}'"
          when :tablespace
            " TABLESPACE = \"#{value}\""
          when :connection_limit
            " CONNECTION LIMIT = #{value}"
          else
            ""
          end
        end

のsumでエラーになります。

https://github.com/rails/rails/blob/e17e25cd23e8abd45b1706463dd57c90fa6dcb7c/activesupport/lib/active_support/core_ext/enumerable.rb#L58

  def sum(identity = 0, &block)
    if block_given?
      map(&block).sum(identity)
    else
      inject(:+) || identity
    end
  end

で、identityの初期値0と文字列を結合しようとして String can't be coerced into Integer が出ます。 Ruby 2.4 以降はArray#sumが使われて型変換が起きる、のかな?

回避策もおもしろくて、どうもrake db:create以外は大体動くっぽいです。 ので rake db:create の代わりにSQLで直接 CREATE DATABASE "hogehoge" ENCODING = 'unicode'; するのが、Rubyのバージョンを変えたりするより、てっとり早かったです。

Ruby 2.5 と devise 3

Ruby 2.5では、deviseの3系は最新版(3.5.10)が動きません。 github3-stableブランチには修正版が上がっています。

次のようにGemfileでgithubのブランチを指定すれば、Ruby 2.5 と devise 3 を組み合わせて使えます。

gem 'devise', git: 'https://github.com/plataformatec/devise' , branch: '3-stable'

Turbolinks 2.5

Turbolinks.enableProgressBarは2.5までしかありません。 https://github.com/turbolinks/turbolinks-classic/tree/2-5-stable#progress-bar

In Turbolinks 3.0, the progress bar will be turned on by default.

3.0 以上に上げるときは、Turbolinks.enableProgressBarは消しましょう。

mysql2 0.4.10とrails 4.2.5

mysql2 は 0.4.10からMySQL 8 をサポートしています。 https://github.com/brianmario/mysql2/issues/980

rails は 4.2.5からmysql2 0.4.5をサポートしています。 https://qiita.com/park-jh/items/93ec6e967c1731fd90b3

MySQL 8 を使うためにmysql2のバージョンを上げるときは、Railsのバージョンも一緒に上げる必要があります。