自分は普段Web系の技術とは関わりがあまりないのですが、ある意味IT系に関わっているのもあり、この際Webサイトの作り方くらいは知っておこうとRails Tutorialをやってみることにしました。
プログラミングスクールの中にはこれをやるだけでウン十万も取るようなところもあるようですが、教材は無料で公開されているのでその気になれば一切費用を掛けずにやることも可能です。
そんなわけで少し前(2021/07)に3週間ほどかけてやってみたので、チュートリアルに書かれていないエラーなどの解消メモを備忘録がてら残そうと思います。
なお、Rails 6.0に対応した教材(第6版)は有料だったため、今回取り組んだのはRails 5.1(第4版)です。2021/07現在の各ライブラリの更新状況に合わせ、最低限Rails Tutorial 5.1を完走するのに必要だった追加作業をまとめていく感じになります。また、各問題を解消するにあたって参考にしたサイトがあった場合はそちらも合わせて記載しています。
自分は趣味程度にやってみようと思っただけなのでこれで良いのですが、実際に仕事で使うスキル求める人は第6版を購入して実施した方が良いかと思われます(セキュリティなど、最新版の方が強固になっているはずなので)。
また、Windowsでやってみた系の情報は数が限られているというのもあり、モノ好きな方の一助となればと思い書こうと思います。誤り等あればコメントいただけると幸いです。
今回前提とする環境は下記のとおりです。
- OS: Windows 10 Home
- プロセッサ:Intel Core i7-8750H CPU(デュアルコア:2.20GHz, 2.21GHz)
- RAM: 16GB
また、使用するRubyおよびRailsのバージョンは次の通りです。
- Ruby: Version 2.7
- Rails: Version 5.1
ライブラリの問題はほとんどがGemFileの修正になるので、最終的に自分の環境ではこのようになったという情報を先に載せておきます。
source 'https://rubygems.org'
gem 'rails', '5.1.6'
gem 'bcrypt', '3.1.16'
gem "faker", "2.18.0"
gem "carrierwave", "~> 2.0"
gem "mini_magick", "4.7.0"
gem "will_paginate", "3.1.6"
gem "bootstrap-will_paginate", "1.0.0"
gem 'puma', '3.9.1'
gem 'sass-rails', '5.0.6'
gem 'uglifier', '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks', '5.0.1'
gem 'jbuilder', '2.7.0'
gem 'bootstrap-sass', '3.3.7'
group :development, :test do
gem 'sqlite3', '1.3.13'
gem 'byebug', '9.0.6'
end
group :development do
gem 'web-console', '3.5.1'
gem 'listen', '3.1.5'
gem 'spring', '2.0.2'
gem 'spring-watcher-listen', '2.0.1'
end
group :test do
gem 'rails-controller-testing', '1.0.2'
gem 'minitest', '5.10.3'
gem 'minitest-reporters', '1.1.14'
gem 'guard', '2.16.2'
gem 'guard-minitest', '2.4.4'
end
group :production do
gem 'pg', '1.2.3' # Rubyのバージョンに合わせて変更
gem "fog", "1.42"
end
# Windows環境ではtzinfo-dataというgemを含める必要あり
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
目次
- 1 各エラーとその解消方法
- 1.1 【2章】db:migrate が上手く動かない場合の対処
- 1.2 【6章】has_secure_passwordを使えるようにするまでの道のり
- 1.3 【7章】byebug / debugger が動作しない場合の対応
- 1.4 【10章】rails server がローカルで起動できなくなる場合の対応
- 1.5 【10章】faker のバージョン指定について
- 1.6 【10章】rails db:migrate:resetが上手く動作しないことに関して
- 1.7 【10章】rails test 実行時に db:migrate RAILS_ENV=test を実行しろと促されるが、それを実行しても改善しない場合
- 1.8 【11章】アカウントの有効化テストについて
- 1.9 【13章】GemFileに画像取り扱いライブラリを追加する際に出る警告
- 1.10 【13章】ImageMagicとの連携
- 1.11 【13章】AWS S3との連携
- 1.12 【13章】scss を変更した際に遭遇したエラー
各エラーとその解消方法
【2章】db:migrate が上手く動かない場合の対処
1章の内容をAWS Cloud9で始めるのではなくWindows10のローカル環境で行った場合、おそらくrails server
を実行した際にエラーが発生し、それを基に検索すると以下の記事に行きつくと思います。
sqlite3のロードに失敗するので、それが実行できるように環境を整えるというものです。しかし、この記事に書かれているコマンドをそのまま実行しても、上手く動かない場合があります。特に、2章に入ったとき、rails db:migrate
を実行するタイミングで同じエラーに悩まされることになると思います。
この場合、どこを修正するべきか以下に示します。
上記の記事における2番目の手順「sqlite3_naive.soファイルの生成」にて
gem install sqlite3 --platform=ruby -- --with-sqlite3-include=C:/sqlite-amalgamation-3260000 --with-sqlite3-lib=C:\Ruby27-x64\bin
のコマンドを実行する際に「-v “1.3.13”」と、Rubyのsqlite3ライブラリのバージョンを指定する必要があります。また、最後の Ruby27-x64… のところも、使用するRubyのバージョンに合わせる必要があります(これは実際に使用するRubyのバージョンに合わせて変更してください)。
これを実行すると、”C:\Ruby27-x64\lib\ruby\gems\2.7.0\gems\sqlite3-1.3.13\lib\sqlite3\sqlite3_native.so”が生成されているので、これを以下にコピーします。
“C:\Ruby27-x64\lib\ruby\gems\2.7.0\gems\sqlite3-1.3.13-x64-mingw32\lib\sqlite3\2.7”
なお、指定するsqlite3ライブラリのバージョンですが、これはGemfileで指定しているバージョンと同じものを指定すればOKです。今回、自分の環境では次のように指定していました。
# (前略)
group :development, :test do
gem 'sqlite3', '1.3.13'
gem 'byebug', '9.0.6'
end
# (後略)
解決には以下を参照しました。
【6章】has_secure_passwordを使えるようにするまでの道のり
Gemfileに、Tutorial記載の通り
gem ‘bcrypt’, ‘3.1.12’
と書いてbundle install, rails test:modelsを実行すると、以下のエラーが出る
rails aborted!
LoadError: cannot load such file -- bcrypt_ext
C:/Users/"User Name"/Desktop/RailsTutorial/environment/sample_app/config/application.rb:7:in `<top (required)>'
C:/Users/"User Name"/Desktop/RailsTutorial/environment/sample_app/Rakefile:4:in `require_relative'
C:/Users/"User Name"/Desktop/RailsTutorial/environment/sample_app/Rakefile:4:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Caused by:
LoadError: cannot load such file -- 2.7/bcrypt_ext
C:/Users/"User Name"/Desktop/RailsTutorial/environment/sample_app/config/application.rb:7:in `<top (required)>'
C:/Users/"User Name"/Desktop/RailsTutorial/environment/sample_app/Rakefile:4:in `require_relative'
C:/Users/"User Name"/Desktop/RailsTutorial/environment/sample_app/Rakefile:4:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
(See full trace by running task with --trace)
解消には結構時間がかかりましたが、結局Gemfileに記載するbcryptライブラリのバージョンが適切でないことが原因だったようです。
Gemfileに記載するバージョンを”3.1.12″から”3.1.16“に変更することで解決しました。
gem 'bcrypt', '3.1.16'
その後rails test:modelsを実行すると、test環境でdbをmigrateしろと言われるので、以下のコマンドを実行します。
rails db:migrate RAILS_ENV=test
これを実行したあとで、rails test:modelsとすれば無事テストが走るはずです。
【7章】byebug / debugger が動作しない場合の対応
GemFileの一部を変更する。Tutorial通りの記載をした、動作しない場合のGemFileは次の通り。
# 前略
group :development, :test do
gem 'sqlite3', '1.3.13'
gem 'byebug', '9.0.6', platform: :mri # ← ここが問題
end
# 後略
このplatform: :mri
の部分を削除し、以下のようにする。
# 前略
group :development, :test do
gem 'sqlite3', '1.3.13'
gem 'byebug', '9.0.6'
end
# 後略
その後、GemFileと同じ階層に生成されているGemFile.lockというファイルを削除し、再度bundle installを実行することで使用可能になる。
【10章】rails server がローカルで起動できなくなる場合の対応
Tutorialで作業中、rails s
コマンドを実行するとエラーが起き、以下のように表示される。
ERROR: worker mode not supported on JRuby or Windows
7章で config/puma.rb を編集するが、その1行目
workers Integer(ENV["WEB_CONCURRENCY"] || 2)
をコメントアウトすることでローカルでも動作する(10章になるまで問題にならなかったのは、ローカルのサーバープロセスをずっと起動していたため?理由は不明)。
この行は、Webサーバーをマルチプロセスで起動することを表していますが、Windowsではマルチプロセスでの起動に対応していないため、コメントアウトする必要があるようです。
以降、デプロイ時・ローカルでのサーバー起動時でその行を有効化・コメントアウトするのを手動で切り替えるという方法しか現状ないようです。面倒ですがWindows環境で実施する場合は仕方ないですね。
【参考URL】
【10章】faker のバージョン指定について
現時点での最新版にすることで動作した。GemFile記載の内容を次のように変更。
# 前略
gem "faker", "2.18.0"
# 後略
【faker 公式URL】
【10章】rails db:migrate:resetが上手く動作しないことに関して
Windowsではバグのせいで上手く動作しない模様。手動でDBを削除、再度 rails db:migrate
を実施することで対処。
※ sample_app/db/development.sqlite3 が対応DBなので、それを削除・再マイグレートという手順になる。
【10章】rails test 実行時に db:migrate RAILS_ENV=test を実行しろと促されるが、それを実行しても改善しない場合
rails test を実行した際に、以下のようにdb:migrate RAILS_ENV=test
を実行しろと表示されることがありますが、それを実行しても再度同様のエラーが表示される場合が存在します。
C:\Users\"User Name"\Desktop\RailsTutorial\environment\sample_app>rails test
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/activerecord-5.1.6/lib/active_record/connection_adapters/sqlite3_adapter.rb:30: warning: rb_check_safe_obj will be removed in Ruby 3.0
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/activerecord-5.1.6/lib/active_record/connection_adapters/sqlite3_adapter.rb:30: warning: rb_check_safe_obj will be removed in Ruby 3.0
Migrations are pending. To resolve this issue, run:
bin/rails db:migrate RAILS_ENV=test
解決方法についてですが、まず development.sqlite3, test.sqlite3 を手動で削除、Rails の Serverプロセスを起動しているときはそれも停止します(rails s
を実行しているコマンドプロンプトを閉じるなどしてプロセスを停止)。
その上で以下のコマンドを順に打ち込むと動作します。要は、再度データベースを作成するということですね
rails db:migrate
rails db:seed
rails db:migrate RAILS_ENV=test
rails test
上手く動作したときのログは以下の通り。
> rails db:migrate RAILS_ENV=test
C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/activerecord-5.1.6/lib/active_record/connection_adapters/sqlite3_adapter.rb:30: warning: rb_check_safe_obj will be removed in Ruby 3.0
== 20210703125652 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0012s
== 20210703125652 CreateUsers: migrated (0.0023s) =============================
== 20210703155854 AddIndexToUsersEmail: migrating =============================
-- add_index(:users, :email, {:unique=>true})
-> 0.0014s
== 20210703155854 AddIndexToUsersEmail: migrated (0.0024s) ====================
== 20210704022357 AddPasswordDigestToUsers: migrating =========================
-- add_column(:users, :password_digest, :string)
-> 0.0016s
== 20210704022357 AddPasswordDigestToUsers: migrated (0.0027s) ================
== 20210705144801 AddRememberDigestToUsers: migrating =========================
-- add_column(:users, :remember_digest, :string)
-> 0.0012s
== 20210705144801 AddRememberDigestToUsers: migrated (0.0023s) ================
== 20210709155421 AddAdminToUsers: migrating ==================================
-- add_column(:users, :admin, :boolean, {:default=>false})
-> 0.0012s
== 20210709155421 AddAdminToUsers: migrated (0.0020s) =========================
【11章】アカウントの有効化テストについて
例えば、適当なユーザー作成を試みるとhttps://localhost:3000/account_activations/uanAGUiWBEax669xIlBgwQ/edit?email=test_hoge%40example.com
にアクセスしろとサーバープロセスのログに表示される。
ただし、これをコピペするとブラウザでは上手く表示できない。「https://」の部分が余計なので、
localhost:3000/account_activations/uanAGUiWBEax669xIlBgwQ/edit?email=test_hoge%40example.com
のようにしてアクセスする必要がある(ローカルで開発する際の注意点)。
【13章】GemFileに画像取り扱いライブラリを追加する際に出る警告
「警告:循環依存が検出されました…」と出るが、問題なくインストールできる。少し時間がかかる(数分)のでそこで止めないこと。
以下は実際のログの例です。
Fetching gem metadata from https://rubygems.org/........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Using rake 13.0.3
Using concurrent-ruby 1.1.9
Using i18n 1.8.10
Using minitest 5.10.3
Using thread_safe 0.3.6
Using tzinfo 1.2.9
Using activesupport 5.1.6
Using builder 3.2.4
Using erubi 1.10.0
Using racc 1.5.2
Using nokogiri 1.11.7 (x64-mingw32)
Using rails-dom-testing 2.0.3
Using crass 1.0.6
Using loofah 2.10.0
Using rails-html-sanitizer 1.3.0
Using actionview 5.1.6
Using rack 2.2.3
Using rack-test 1.1.0
Using actionpack 5.1.6
Using nio4r 2.5.7
Using websocket-extensions 0.1.5
Using websocket-driver 0.6.5
Using actioncable 5.1.6
Using globalid 0.4.2
Using activejob 5.1.6
Using mini_mime 1.1.0
Using mail 2.7.1
Using actionmailer 5.1.6
Using activemodel 5.1.6
Using arel 8.0.0
Using activerecord 5.1.6
Using public_suffix 4.0.6
Using addressable 2.8.0
Using ansi 1.5.0
Using execjs 2.8.1
Using autoprefixer-rails 10.2.5.1
Using bcrypt 3.1.16
Using bindex 0.8.1
Using rb-fsevent 0.11.0
Using ffi 1.15.3 (x64-mingw32)
Using rb-inotify 0.10.1
Using sass-listen 4.0.0
Using sass 3.7.4
Using bootstrap-sass 3.3.7
Using will_paginate 3.1.6
Using bootstrap-will_paginate 1.0.0
Using bundler 2.1.4
Using byebug 9.0.6
Using mini_magick 4.7.0
Fetching ruby-vips 2.1.2
Installing ruby-vips 2.1.2
警告: 循環依存が検出されました:
警告: mingw-w64-x86_64-harfbuzz は依存パッケージ mingw-w64-x86_64-freetype の前にインストールされます
警告: 循環依存が検出されました:
警告: mingw-w64-x86_64-libwebp は依存パッケージ mingw-w64-x86_64-libtiff の前にインストールされます
Fetching image_processing 1.7.1
Installing image_processing 1.7.1
Using marcel 1.0.1
Fetching ssrf_filter 1.0.7
Installing ssrf_filter 1.0.7
Fetching carrierwave 2.2.2
Installing carrierwave 2.2.2
Using coderay 1.1.3
Using coffee-script-source 1.12.2
Using coffee-script 2.4.1
Using method_source 1.0.0
Using thor 1.1.0
Using railties 5.1.6
Using coffee-rails 4.2.2
Using faker 2.18.0
Using formatador 0.3.0
Using ruby_dep 1.5.0
Using listen 3.1.5
Using lumberjack 1.2.8
Using nenv 0.3.0
Using shellany 0.0.1
Using notiffany 0.1.3
Using pry 0.14.1
Using guard 2.16.2
Using guard-compat 1.2.1
Using guard-minitest 2.4.4
Using multi_json 1.15.0
Using jbuilder 2.7.0
Using jquery-rails 4.3.1
Using ruby-progressbar 1.11.0
Using minitest-reporters 1.1.14
Using puma 3.9.1
Using sprockets 3.7.2
Using sprockets-rails 3.2.2
Using rails 5.1.6
Using rails-controller-testing 1.0.2
Using tilt 2.0.10
Using sass-rails 5.0.6
Using spring 2.0.2
Using spring-watcher-listen 2.0.1
Using sqlite3 1.3.13 (x64-mingw32)
Using turbolinks-source 5.2.0
Using turbolinks 5.0.1
Using tzinfo-data 1.2021.1
Using uglifier 3.2.0
Using web-console 3.5.1
Bundle complete! 29 Gemfile dependencies, 93 gems now installed.
Gems in the group production were not installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
【13章】ImageMagicとの連携
ImageMagic ver.7台だとうまく動作しない。
以下のリンクからver.6.x.x台の最新をインストールする(dll.exe → インストーラが起動するので、案内に従ってインストール)
【ImageMagicの公式-ver6以前のアーカイブ】
【参考URL】
【13章】AWS S3との連携
Tutorialそのままでは、内部で接続エラーが発生する(heroku logsで確認)
以下を参考に、config/initializers/carrier_wave.rb に以下の一文を追加して対応
config.fog_public = false
これで本番環境でもアップロードが実行できる。
carrier_wave.rbの中身の全体は下記の通り
if Rails.env.production?
CarrierWave.configure do |config|
config.fog_credentials = {
# AWS S3 用の設定
:provider => "AWS",
:region => ENV["S3_REGION"],
:aws_access_key_id => ENV["S3_ACCESS_KEY"],
:aws_secret_access_key => ENV["S3_SECRET_KEY"]
}
config.fog_directory = ENV["S3_BUCKET"]
config.fog_public = false # S3アクセスのため追加
end
end
【参考URL】
【13章】scss を変更した際に遭遇したエラー
下記のようなエラーが出る場合がある。
Errno::EACCES in StaticPages#home
Permission denied @ rb_file_s_rename - (C:/Users/"User Name"/Desktop/RailsTutorial/environment/sample_app/tmp/cache/assets/sprockets/v3.0/9K/9KRQYKb2a17g9MMHqpxLENlccj6y-KSBSKtpLDyWprQ.cache.19420.14304.482409, C:/Users/"User Name"/Desktop/RailsTutorial/environment/sample_app/tmp/cache/assets/sprockets/v3.0/9K/9KRQYKb2a17g9MMHqpxLENlccj6y-KSBSKtpLDyWprQ.cache)
キャッシュが原因のようで、tmp/assets/cache以下のファイルを全削除することで解消可能。
【参考URL】
コメント