Trouble shooting」カテゴリーアーカイブ

Railsの環境構築(エラー対処録)

Railsの環境設定で手こずったので解消するまでやったことを書き留めていきます。

MacのOSは Catalina10.15.7です。

バージョンは最終的に以下のようになります

rbenv 1.1.2
Bundler 2.0.2
Ruby 2.7.5
Rails 5.2.3

1:Homebrewをインストール

Homebrewは、ソフトウェアの導入を単純化するMac OSのパッケージ管理システムです。

下記のURLからHomebrewをインストールします。

Homebrew

2:rbenvをインストールする

rbenvをインストールします。rbenvをインストールすることでrubyのバージョンの切り替えが容易にできるようになります。

brew install rbenv
brew install ruby-build

ruby-buildをインストールすることで、rbenv installというコマンドを使うことができます。

上記のコマンドを実行したらrbenvがインストールされているか確認します。以下のコマンドを実行してバージョンの情報が表示されていればインストールされています。

rbenv --version
rbenv 1.1.2

3:rbenvにPATHを通す

rbenvコマンドを利用するために、rbenvにPATHを通します。PATHを通すとは、コマンド実行ファイルを探しに行くパスを追加することです。

echo 'export PATH="HOME/.rbenv/bin:PATH"' >> ~/.bash_profile
echo 'if which rbenv > /dev/null; then eval "(rbenv init -)"; fi' >> ~/.bash_profile
source ~/.bash_profile

4:Rubyをインストールする

下記のコマンドでRubyをインストールします。

 rbenv install 2.5.1

次にグローバルで利用するバージョンを設定します。

 rbenv global 2.5.1

次にRubyのバージョンの情報を確認します。

ruby -v
ruby 3.0.0    ←ここでグローバルに変わっていない

5:rbenvにPATHを通す

OSがCatalinaでzshなのでPathを変えてみました。

~/.zshenvに
export PATH="/usr/local/bin:$PATH"
export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH" # この一行を追加

↑最後の一行を追加し、~/.zshrcに

~/.zshrc
source $HOME/.zshenv

を追加しました。

またRubyのバージョンの情報を確認します。

ruby -v
ruby 3.0.0    ←グローバルに変わっていない

ここで↓のコマンドで.ruby-versionを確認したところ

vi /Users/ユーザー名/.ruby-version

3.0.0となっていたので
2.5.1に変更します。(iでINSERTモードにして、2.5.1に書き換えてからEscを押して、:wqで上書き保存する)

ruby -v
ruby 2.5.1 ←2.5.1に変わった

6:bundlerをインストールする

bundlerとはGem同士の互換性を保ちながらパッケージの種類やバージョンを管理してくれる仕組みのことです。

bundlerをインストールします。

gem install bundler

上記のコマンドを実行したらbundlerのバージョンを確認します。バージョン情報が表示されていればインストールされています。

bundler -v
Bundler version 2.0.2

7:Railsをインストールする

最後にRailsをインストールします。以下のコマンドを実行します。

gem install rails -v 5.2.3

実行ができたら以下のコマンドでRailsのバージョンを確認します。

rails -v

bin/rails:3:in `require_relative': cannot load such file -- /Users/caimユーザー名/Desktop/config/boot (LoadError)
from bin/rails:3:in `<main>'

エラーでrailsコマンドが使えない・・・

sudoをつけてもう1回試してみる

sudo gem install rails -v 5.2.3

次のようなエラーが出ました

ERROR: Error installing rails:
There are no versions of activesupport (= 7.0.2.2) compatible with your Ruby & RubyGems. Maybe try installing an older version of the gem you're looking for?
activesupport requires Ruby version >= 2.7.0. The current ruby version is 2.6.9.207.

rubyのバージョンを2.7.0以上にしろと言ってるので

rbenv install 2.7.5
vi /Users/ユーザー名/.ruby-version

2.7.5に変更します。(iでINSERTモードにして、2.7.5に書き換えてからEscを押して、:wqで上書き保存する)

rbenv global 2.7.5
ruby -v
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-darwin19]

2.7.5に変わったので、railsを再インストールします。

sudo gem install rails -v 5.2.3

インストールできているか確認します。

rails -v 

Rails is not currently installed on this system. 
To get the latest version, simply type:

   $ sudo gem install rails
You can then rerun your "rails" command.

↑のようなメッセージが出たので、↓のコマンドをします。

hash -r

確認します。

rails -v
Rails 5.2.3

長かったですがなんとか環境構築できました。

ActiveRecord::NoDatabaseError – Unknown database ‘xxx’:(エラーメッセージ対処法)

Docker + Railsで開発中の時に遭遇しました。

ActiveRecord::NoDatabaseError – Unknown database ‘xxx’:とは?

docker-compose upでコンテナを起動した時に発生

データベースが作成されていないためのエラーなのでデータベースを作成します。

$ docker-compose exec web bundle exec rake db:create

Created database ‘***’と出ていればOKです。

この状態でアクセスすると

Migrations are pending. To resolve this issue, run:というエラーが発生します。

マイグレートすれば解決するので、マイグレートします。

$ docker-compose exec web bundle exec rake db:migrate

docker-compose upでコンテナを起動してエラーが出なくなっているのを確認しました。

Migrationを保留しているというエラーだったのでMigrationを実行するとエラーが出なくなります。

Can’t connect to MySQL server on “”(AWS+MySQLエラー対処録)

AWSでEC2にログインしてMySQLに接続するために以下のコマンドをしたところ

mysql -h my-portfolio-web.c*********l.ap-northeast-1.rds.amazonaws.com -u admin -p

ERROR 2003 (HY000): Can’t connect to MySQL server on ‘my-portfolio-web.c*******l.ap-northeast-1.rds.amazonaws.com’ (110)

確認すること

RDSのダッシュボードのデータベースを選択して、データベースが動作しているか(停止中でないか)確認します。

セキュリティーグループを確認する。

EC2ダッシュボードの「セキュリティーグループ」を選択して、「インバウンドルールを編集」をクリックします。

インバウンドルールのタイプがMySQL/Auroraでソースのセキュリティーグループが設定されているか確認します。

ソースのセキュリティーグループのインバウンドルールが↓のようであればOK です。

mysql -h my-portfolio-web.c*********l.ap-northeast-1.rds.amazonaws.com -u admin p

ERROR 1045 (28000): Access denied for user ‘admin’@’10.10.0.10’ (using password: NO)

とエラーが出てしまいました・・・
これは-u admin -pの部分が-u admin pになっていたためでした。

正しいコマンドをします。(****の部分は環境で変わる部分です)

mysql -h my-portfolio-web.c*********l.ap-northeast-1.rds.amazonaws.com -u admin -p

MySQLに接続できました!

エスケープ処理されてしまったときの対処(エラー対処録)

経緯: グラフ作成機能を開発していたときのこと

controllerの記述

def show
  @user = current_user
  @hiits = @user.hiits
  @graphdays = @hiits.order(:training_day).limit(1000)
  @dayline = Array.new
  @graphdays.each do |graphday|
    @dayline.push(graphday.training_day.strftime('%Y/%m/%d').to_s)
  end
  @graphtimes = @hiits.order(:training_day).limit(1000)
  @minuteline = Array.new
  @graphtimes.each do |graphtime|
    @minuteline.push(graphtime.training_time)
  end
end

show.html.erbの記述

<div class="chart-container" style="position: relative; width: 100%; height: 400px;">
  <canvas id="My_Chart"></canvas>
</div>
<script>
    var graphdays = <%= @dayline %>, graphminutes =
    <%= @minuteline %>
</script>
<script>draw_graph();</script>

 

グラフが表示されない・・・

検証してみてみると

var graphdays = [&quot;2021/03/11&quot;, &quot;2021/03/30&quot;, &quot;2021/04/07&quot;, &quot;2021/04/09&quot;, &quot;2021/04/10&quot;, &quot;2021/04/16&quot;, &quot;2021/04/16&quot;], graphminutes =
[22, 15, 20, 10, 10, 6, 10]

“が&quot;に変換されている!

原因はRails3から<%= ~ %>を使って出力を行う場合に自動的にエスケープ処理が行われるようになったため。

<script>
var graphdays = <%= raw @dayline %>, graphminutes =
<%= @minuteline %>
</script>
<script>draw_graph();</script>

または

<script>
var graphdays = <%== @dayline %>, graphminutes =
<%= @minuteline %>
</script>
<script>draw_graph();</script>

とするとエスケープされないように出力できる

var graphdays = ["2021/03/11", "2021/03/30", "2021/04/07", "2021/04/09", "2021/04/10", "2021/04/16", "2021/04/16"],
 graphminutes = [22, 15, 20, 10, 10, 6, 10]

グラフが描画された!

@dayline.html_safeで試した場合はエラーとなった。

rawと<%==%>は<%==%>のほうがパフォーマンス上のメリットが少々あるそうなので後者を選ぶことにした。

WARNING: UNPROTECTED PRIVATE KEY FILE!(エラー対処録)

経緯:EC2にsshキーでログインしようとしたところ

WARNING: UNPROTECTED PRIVATE KEY FILE!と怒られた

原因

秘密鍵のPermissionが0644だったので許可されなかった。

対処法

sudo chmod 600 ~/Desktop/〇〇.pem
                ↑秘密鍵の場所(各自置いているところで異なります)

chmod 600でパーミッションを変えてあげたところログインできました。

※秘密鍵の場所と秘密鍵の名前は各自で異なりますのでご注意を

自分は秘密鍵をデスクトップに仮置していたのでDesktopとなっています。

 

(Zeitwerk::NameError)エラー対処録Ruby+Heroku

Herokuでうまくデプロイできていなかったので

heroku run console 

で調べたところ次のようなエラーが出ました。

/app/vendor/bundle/ruby/3.0.0/gems/zeitwerk-2.5.4/lib/zeitwerk/loader/callbacks.rb:25:in `on_file_autoloaded’: expected file /app/app/serializers/〇〇_serializer.rb to define constant 〇〇Serializer, but didn’t (Zeitwerk::NameError)

解決法

config.autoloader = :classic

config/application.rbに追加する

〜〜
〜〜

#moduleから上は省略
module Api
  classApplication < Rails::Application

# Initialize configuration defaults for originally generated Rails version.
    config.load_defaults6.1
# Configuration for the application, engines, and railties goes here.
# These settings can be overridden in specific environments using the files
# in config/environments, which are processed later.
# config.time_zone = "Central Time (US & Canada)"
# config.eager_load_paths << Rails.root.join("extras")
#  これを追加↓
     config.autoloader = :classic
# Only loads a smaller set of middleware suitable for API only apps.
# Middleware like session, flash, cookies can be added back manually.
# Skip views, helpers and assets when generating a new resource.
     config.api_only = true
  end
end

追加して保存後に

bundle exec pumactl start

↑をコマンドしたところpumaを起動することができました。

ExecJS::RuntimeError in Users#show(エラー対処録)

ExecJS::RuntimeError in Users#show

Showing /lifehack/app/views/layouts/_head.html.erb where line #8 raised:

SyntaxError: [stdin]:5:19: reserved word ‘function’
Trace of template inclusion: app/views/layouts/application.html.erb

初めてみたエラーだったので記録

経緯

JQueryのスクリプトをパーシャルとしてリファクタリングしようとした。

原因

javascripts/task.coffeeに間違えて以下(JQueryのスクリプト)を記述したら生じた。

<script>
  $("span").click(function () {
  $("h3").toggle("slow");
});
</script>

解決法

javascripts/task.coffeeの↑の記述を削除する。

補足

views/shared/_script.html.erbにスクリプトを記述して

<%= render 'shared/script' %>

で使いました。