Rails tutorial で苦戦したところメモ

#環境
・Windows10
・ruby-2.6
・ruby-on-rails-5.0.3
・rails tutorial第4版

###用途
rails tutorial2回目用(やるとは言っていない)

何かあれば更新して、知識を蓄積


##第1章
###Herokuにデプロイができなかった
チュートリアル通り進めているのに、デプロイがうまくいかない

【原因】
リモートリポジトリが適切に設定できていなかった
(heroku create コマンドを入力すると勝手にリモートリポジトリ設定されるみたいなのですが
　私はそんなことなく、原因を彷徨い続けました)

【対策】
下記コマンドで自分でリモートリポジトリをgitに登録

```git
git remote add heroku https://git.heroku.com/<heroku createした時のアプリ名>.git
```

<参考画像>
※黄色で囲っているのがアプリ名
![Qiita 2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526141/11f18df0-8d01-b9b3-baf4-1d21ebb82ae6.png)
水色の字をURLに打ち込むと自分のデプロイしたアプリを確認することができる


##第2章
###自動生成されたページ開こうとすると「ExecJS::ProgramError」
toy_app\app\views\layouts\application.html.erb　の7、8行目が悪さしているみたいです。
![Qiita 2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526141/3783aa0c-3e65-6528-cc17-300f7bcae738.png)
【原因】
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の結果にかかわらず上記の結果が表示されるはずです。
ですが、

```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に

```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に変更。変更に伴って、下記の修正が必要になる。
1. インストールするImagemagickは6系にする必要がある
 →7系をインストールした時に、環境変数を保存している場合、消す必要あり
2. 「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