0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-08-01

#環境
・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

<参考画像>
※黄色で囲っているのがアプリ名
Qiita 2-2.png
水色の字をURLに打ち込むと自分のデプロイしたアプリを確認することができる

##第2章
###自動生成されたページ開こうとすると「ExecJS::ProgramError」
toy_app\app\views\layouts\application.html.erb の7、8行目が悪さしているみたいです。
Qiita 2-1.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の結果にかかわらず上記の結果が表示されるはずです。
ですが、

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に変更。変更に伴って、下記の修正が必要になる。

  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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?