Rails5移行


(1)変更したバージョン

(2)基本方針

1)プロジェクトをRails5環境で新規に作成する

rails new {プロジェクト名} -d postgresql

2)以下のコマンドを投入し、その後テンプレート類を上書きする

rails app:templates:copy

3)認証のdeviseをインストールする

・以下のGEMをGemfileに追加する

gem 'i18n_generators'
gem 'devise'
gem 'devise-bootstrap-views'
gem 'devise-i18n-views'
gem 'devise-i18n'
gem 'scrypt'
gem 'thinreports'
gem 'prawn'
gem 'prawnto'
gem 'will_paginate-bootstrap'
#gem 'simple_form'
gem 'carrierwave'
gem 'era_ja'
#gem 'bootstrap-sass'
gem 'nokogiri'

gem 'momentjs-rails'
gem 'bootstrap3-datetimepicker-rails'
gem 'simple_form'

gem 'jquery-rails' 
gem 'jquery-ui-rails'

・インストール

bundle
rails g devise:install
rails g devise User
rails g devise:views
rails g devise:views:locale ja

4)(※上書き以降の処理がうまくいかない場合には当処理を行う。通常は不要)

Rails4のschema.rbをscaffold用のバッチファイルに変更して 資産を作成し、以下の資産を上書きし、内容を修正する。

Rails4のschema.rb

  create_table "messages", force: :cascade do |t|
    t.string   "msg_code"
    t.text     "message"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "name_msts", force: :cascade do |t|
    t.string "code_id"
    t.string "code_id_name"
    t.string "code"
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

Rails5用のmake.bat ※先頭にcallを付けないとバッチファイルの複数命令は動かないので注意

call rails d scaffold message
call rails d scaffold name_mst
call rails g scaffold message msg_code:string message:text
call rails g scaffold name_mst code_id:string code_id_name:string code:string name:string

5)上書き・修正資産

(3)修正

(3-1)assets/javascript

(修正1)jqueryが標準でなくなったため以下の修正を行う。

・app/assets/javascripts/application.jsに以下を追加

//= require jquery

※関連修正

・Gemfileに以下を追加

gem 'jquery-rails' 
gem 'jquery-ui-rails'

(3-2)app/models

(修正1)以下の修正をすることをRailsのアップグレードガイドに記載されているが修正しなくても動く

model

・application_record.rbを追加

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

・その他のmodelはActiveRecord::Baseを継承していたのをApplicationRecordに変更

【変更前】

class Message < ActiveRecord::Base
end

【変更後】

class Message < ApplicationRecord
end

(修正2)belongs_toは親が存在しないとvalidationエラーになるので

従来通りの動きにしたければ、以下の通り変更する

【変更前】

belongs_to :user

【変更後】

belongs_to :user, optional: true 

(3-3)db/miglate

・各migrationファイルを以下の通り変更する

【変更前】

class CreateMessages < ActiveRecord::Migration

【変更後】

class CreateMessages < ActiveRecord::Migration[5.2]

(3-4)config/application.rb

・以下の内容を追加する

config.autoload_paths += %W(#{Rails.root}/lib)
config.eager_load_paths += %W(#{Rails.root}/lib) 
config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local
config.i18n.default_locale = :ja
config.assets.precompile += %w( **/*.css **/*.js *.png themes/*.css)

(3-5)devise(認証GEM)の修正

・bcryptでエラー(cannot load such file -- bcrypt)になるので、以下の対応を行う。

【対応前】以下の様に表示されるとNG

> gem list bcrypt
*** LOCAL GEMS ***
bcrypt (3.1.12 x64-mingw32)

【対応】

Gemfile

gem 'bcrypt', '3.1.11', platforms: :ruby
> gem uninstall bcrypt
> gem install bcrypt --platform=ruby

以下の様に表示されるとOK

> gem list bcrypt
*** LOCAL GEMS ***
bcrypt (3.1.12)

(3-6)constantsの修正

Rails4ではではconfig/application.rbにautoloadを追加し、libにcmn_connstants.rb(任意の名前)に 定数を定義していたが、Rails5では認識されなかったので、config/initializers/connstants.rbに リネーム後配備した。

(3-7)production用の修正

config/environments/production.rbを以下の様に修正する

(1)public配下の静的な資産を読み込み可能にする

【変更前】

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

【変更後】

config.public_file_server.enabled = true

(2)モーダルを使用している場合以下の修正をする(以下の設定をしないとモーダルを開けるときにエラー。詳細不明)

config/environments/production.rbに以下の設定を変更する

【変更前】

config.assets.js_compressor = :uglifier

【変更後】

config.assets.css_compressor = :sass

(3)asstetsの動的precompileを可能にする

【変更前】

config.assets.compile = false

【変更後】

config.assets.compile = true