#環境
・Windows10
・ruby-2.6
・ruby-on-rails-5.0.3
・rails tutorial第4版
###用途
rails tutorial2回目用(やるとは言っていない)
何かあれば更新して、知識を蓄積
##第1章
###Herokuにデプロイができなかった
チュートリアル通り進めているのに、デプロイがうまくいかない
【原因】
リモートリポジトリが適切に設定できていなかった
(heroku create コマンドを入力すると勝手にリモートリポジトリ設定されるみたいなのですが
私はそんなことなく、原因を彷徨い続けました)
【対策】
下記コマンドで自分でリモートリポジトリをgitに登録
git remote add heroku https://git.heroku.com/<heroku createした時のアプリ名>.git
<参考画像>
※黄色で囲っているのがアプリ名
水色の字をURLに打ち込むと自分のデプロイしたアプリを確認することができる
##第2章
###自動生成されたページ開こうとすると「ExecJS::ProgramError」
toy_app\app\views\layouts\application.html.erb の7、8行目が悪さしているみたいです。
【原因】
generateコマンドで生成されたhtml等は「CoffeeScript」たるものが関わっている臭い。
そのCoffeeScriptのコンパイルには、Windows Script Host(以下WSH)が使われ、Java scriptが動いている。
しかし、そのコンパイルのタイミングでWHSに存在しない手法を取ろうとし、エラーが発生している模様。
【対策】
Node.jsのダウンロード
【結果】
直りました
【余談】
7, 8行目をコメントアウトしても一応、乗り切れます
ただ、javascriptが動かないので色とか何も付きません
【参考サイト】
下記サイトを参考にしました
https://qiita.com/falcon8823/items/f4dc2b5a474869dff449
##第3章
###rails test実行時、test失敗すると実施結果件数が正しく表示されない
実施結果件数とはこれの事です。
3 runs, 6 assertions, 1 failures, 0 errors, 0 skips
本来であれば、testの結果にかかわらず上記の結果が表示されるはずです。
ですが、
Traceback (most recent call last):
19: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:68:in `block in autorun'
18: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/railties-5.0.3/lib/rails/test_unit/minitest_plugin.rb:72:in `run'
17: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:141:in `run'
16: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:164:in `__run'
15: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:164:in `map'
14: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:164:in `block in __run'
13: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/railties-5.0.3/lib/rails/test_unit/line_filtering.rb:11:in `run'
12: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:326:in `run'
11: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:354:in `with_info_handler'
10: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:367:in `on_signal'
9: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:327:in `block in run'
8: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:327:in `each'
7: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:328:in `block (2 levels) in run'
6: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:341:in `run_one_method'
5: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:860:in `record'
4: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:860:in `each'
3: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/minitest-5.14.1/lib/minitest.rb:861:in `block in record'
2: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/railties-5.0.3/lib/rails/test_unit/reporter.rb:23:in `record'
1: from C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/railties-5.0.3/lib/rails/test_unit/reporter.rb:70:in `format_rerun_snippet'
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/railties-5.0.3/lib/rails/test_unit/reporter.rb:70:in `method': undefined method `test_should_get_help' for class `Minitest::Result' (NameError)
何やら色々文字が出てきて肝心のtest実施結果が分からない。
【原因】
「Minitest」と呼ばれるgemのバージョンがrailsのバージョンとアンマッチしていた。
railsのバージョンが5.1.4以下 & mintestのバージョンが 5.11.0以上の場合、
minstestの仕様変更にrails側が対応していない為、発生する模様
【対策】
gemfileに
gem 'minitest', '5.10.1'
を追加し、整合性を取るように修正。
【参考サイト】
https://qiita.com/jnchito/items/1e928f8088b2cc6bd3fa
###guard実行時、エラーが発生する
下記コマンド実行、するとエラー発生。
bundle exec guard
<ここからエラー内容>
Deprecation warning: Expected string default value for '--listen-on'; got false (boolean).
This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code
You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.
Please add the following to your Gemfile to avoid polling for changes:
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/guard-2.13.0/lib/guard/jobs/pry_wrapper.rb:131:in `_setup': undefined method `file=' for #<Pry::History:0x0000000006355d58>
Did you mean? filter (NoMethodError)
【原因】
guardのバージョンが古い為発生の模様
【対策】
gemfileに最新版を取得するように記述
#gem 'guard', '2.13.0' (このバージョンだと敗北した)
gem 'guard', '2.16.2'
【参考にしたサイト】
https://qiita.com/daishinkawa/items/2cc02591361273354bd5
##第4章
###erbファイルにコメントアウトは効果無し?
<!DOCTYPE html>
<html>
<head>
<!-- <title>SampleApp</title> -->
<!-- <title><%= #yield(:title) %> | Ruby on Rails Tutorial Sample App</title> --> ★問題点
<title><%= full_title(yield(:title)) %></title>
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= yield %>
</body>
</html>
変更点を残したいので適宜コメントアウトしていたらsyntax error発生...。
ruby workspace/development/sample_app/app/views/layouts/application.html.erb:6: syntax error, unexpected '<'
<title>'.freeze;@output_buffer...
^
【原因】
よく分からないが、埋め込みrubyの部分はうまくコメントアウトできていない模様
【対策】
コメントアウトせず、普通に削除
##第6章
###rails test:modelsを行うと「Migrations are pending」が発生してしまう
$rails test:models
rails aborted!
ActiveRecord::PendingMigrationError:
Migrations are pending. To resolve this issue, run:
bin/rails db:migrate RAILS_ENV=test
【原因】
db:migrate を行っていないと、テストを実行できない
※ただし下記コマンドでdb:migrateを行っても同じエラーが発生し続ける
--これは失敗
rails db:migrate
--これは成功
rails db:migrate RAILS_ENV=test
理由は「db:migrate」だとdevelopment環境のDBがmigrateされる為(環境が異なる)
RAILS_ENV=testを付けてテスト環境のDBをmigrateしなければならない。
【参考にしたサイト】
「Migrations are pending」が「rake db:migrate」でも直らない
https://teratail.com/questions/210452?sort=3
###has_secure_passwordを追加後、rails testを行うと「UnknownAttributeError: unknown attribute 'password' for User」が発生してしまう
modelのバリデーションチェックに「has_secure_password」を追加後、
testパターンのsetupメソッドにpassword, password_confirmationカラムに値を入れるよう修正。
def setup
@user = User.new(name: "Example User", email: "user@example.com",
password: "foobar", password_confirmation: "foobar") ←追加
end
その後rails testを実施するとエラーが発生。
$rails test
ERROR["test_email_should_be_present", UserTest, 0.9029438999932609]
test_email_should_be_present#UserTest (0.90s)
ActiveModel::UnknownAttributeError: ActiveModel::UnknownAttributeError: unknown attribute 'password' for User.
test/models/user_test.rb:6:in `setup'
【原因】
不明
【修正方法】
bcryptを最初は3.11 のバージョンでインストールしていたが、
3.15にすることで解決。
【参考になったサイト】
Rails のモデル(フォーム)でパスワードを暗号化して保存する方法
https://qiita.com/ryosuketter/items/805452b7e6bf9637cb57
##第7章
###debuggerを追加すると、「NameError」が発生してしまう
下記の様にUserコントローラーにdebuggerを追加した。
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
debugger ←これ
end
def new
end
end
その後、チュートリアルの指示通りに「http://localhost:3000/users/1」にアクセスすると下記エラーが発生。
NameError (undefined local variable or method `debugger' for #<UsersController:0x000000000e4d81a0>):
【原因】
gemfileのbyebugがインストールされていなかった?
group :development, :test do
gem 'byebug', '9.0.6, platforms: [mri]
end
上記の様になっていたのだが、どうも「plattforms: [mri]」の記述が悪さをしている臭い
→mri以外の環境だったらインストールしないよ! という意味らしい
【対策】
platforms: [mri]を削除
【参考にしたサイト】
Railsにて、debuggerメソッドを差し込むとエラーが出てしまいます。
https://teratail.com/questions/229610
##第8章
###「rails server」を実行すると「ERROR: worker mode not supported on JRuby or Windows」が発生する
いつも通り、rails s でローカルサーバーを立ち上げようとするとエラー発生
$rails s
=> Booting Puma
=> Rails 5.0.3 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
ERROR: worker mode not supported on JRuby or Windows
Exiting
【原因】
第7章でSSL通信の為に「puma.rb」を書き換えたのが原因。
workers Integer(ENV['WEB_CONCURRENCY'] || 2) ←これが原因
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || 'development'
on_worker_boot do
# Worker specific setup for Rails 4.1+
# See: https://devcenter.heroku.com/articles/
# deploying-rails-applications-with-the-puma-web-server#on-worker-boot
ActiveRecord::Base.establish_connection
end
おそらく上記の様に記載したと思うが、1行目にある記述がどうも原因らしい。
【対策】
コメントアウトする
【参考にしたサイト】
rails sができない(開発環境から本番環境)
https://teratail.com/questions/136297
##第13章
Micropostモデルにmount_uploader追加後、ローカルサーバー立ち上げで「uninitialized constant Post::PictureUploader」発生
タイトルにあるように、追加後rails s でローカルサーバーを立ち上げようとするとエラー発生
【原因】
ローカルサーバーの再起動を行っていなかったのが原因。
rails generate uploader によってapp/uploaders に新規でフォルダが作成されているが
サーバーの再起動を行っていなかった為、それを読み込めていなかった為発生。
【対策】
ローカルサーバーを再起動した。
mini_magick が正しく動作しない
gemで「mini_magick」をインストールし、画像を圧縮するとエラー
(解決までにいろいろ奔走したのでエラー内容忘れました...)
【原因】
WIndowsではmini_magickではなくrmagickを使用すべき?
【対策】
gemをmini_magickからrmagickに変更。変更に伴って、下記の修正が必要になる。
- インストールするImagemagickは6系にする必要がある
→7系をインストールした時に、環境変数を保存している場合、消す必要あり - 「include CarrierWave::MiniMagick」を「include CarrierWave::RMagick」に修正。
【参考にしたサイト】
・【Windows】Ruby on Rails + Carrierwave + RMagickで画像のリサイズ
https://tomokiit.hatenablog.jp/entry/rails-curriewave-rmagick
・RMagick を Windows にインストールする方法
https://www.ownway.info/Ruby/rmagick/howtoinstall/windows#procedure4