Rails5移行
(1)変更したバージョン
-
【変更前】
Ruby 2.1
Rails 4.2.0
-
【変更後】
Ruby 2.6.1
Rails 5.2.2
(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)上書き・修正資産
-
assets/javascript・・・・・上書きせず修正(3-1)を行う
assets/images・・・・・・上書き
assets/stylesheets・・・・上書き
app/controllers・・・・・上書き
app/views・・・・・・・・上書き(application.html.erbを除く)
app/helper・・・・・・・・上書き
app/models・・・・・・・修正(3-2)
db/miglate・・・・・・・・修正(3-3)
test/fixtures・・・・・・・上書き
vendor/assets・・・・・・上書き
config/locales・・・・・上書き
config・・・・・・・・修正(3-4)
(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