toshizou-Rails

参考になりそうな記事リンク一覧

カテゴリ別

HTML, CSS共通

【保存版】Webフロントエンド基礎力(初心者向け) - Qiita

HTML
CSS
JavaScript
TypeScript

前提条件: 少し or ある程度JavaScriptがわかる

Vue or React

ここら辺は任意だと思いますが...
とりあえず列挙だけ

命名(よく使う単語チートシート)
その他(個人開発などに使えそう)

AWS CLIバージョン 2 をインストールしようとしたら「インストールできませんでした。」と怒られた

TL;DR(3行で)

  • コマンドラインを使用してインストールした方が楽だった(classmethodは頼りになる)
  • なぜpkgファイルを使ってインストールできなかったのかは分からない「インストール先の選択」を「このコンピュータのすべてのユーザ用にインストール」を選択しなかったから
  • よほどの事情がない限りインストーラ様に従った方が無難

この記事でやること

AWS CLI v2のインストール

開発環境

前提条件

AWS CLI をインストールしていない

経緯

諸事情でOSをダウングレード、クリーンインストールした

そのときに不可視ファイルがバックアップされていなかったため最初から入れ直す必要があったのです。

AWS CLIをインストールしようと調べたらv2なるものが見つかった

下記リンクがすぐに出てきました
aws.amazon.com
その中に下記の記述があったため「今の自分の環境には最適!!」と感じてインストールしようとする

AWS CLI を使用するために Python をインストールする必要はありません。 互換性のあるPythonバージョン、仮想環境、または競合するPythonパッケージについて心配する必要はありません。*1

pkgファイルからmacにインストールしようとするも...

下記からAWSCLIV2.pkgをダウンロードして、
docs.aws.amazon.com
インストーラーを進めていき、「インストール先の選択」を

「自分専用にインストール」

に変更して進めていくと「インストールできませんでした。」と下記の画像が表示されました。

f:id:asdfghtresxc:20200817174937p:plain:w350
cannot_install_awscliv2_macos
原因は「インストール先の選択」を「自分専用にインストール」にしたことが原因でした

「インストール先の選択」を「このコンピュータのすべてのユーザ用にインストール」に変更したらパスワードを求められ入力するとインストールが完了した。

コマンドラインでもインストールできる
$  curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 20.9M  100 20.9M    0     0  3677k      0  0:00:05  0:00:05 --:--:-- 4034k

$  sudo installer -pkg AWSCLIV2.pkg -target /
Password:
installer: Package name is AWS Command Line Interface
installer: Installing at base path /
installer: The install was successful.

$  which aws
/usr/local/bin/aws

$  aws --version
aws-cli/2.0.40 Python/3.7.4 Darwin/18.7.0 exe/x86_64

以上!!!

*1:1

AWSメモ(0.登録 から初期設定まで リンクがほとんど)

 

 

 書くこと

  1. AWS無料枠を確認する
  2. 注意点(自分なりの)
  3. 【本題】AWSアカウント作成、諸設定(リンクのみ)

 

 

AWS無料枠を確認する

aws.amazon.com

 上記で確認することができます。

少なくとも下記を守れば1年間無料で使うことができるはず...

  • awsに登録したことがないメールアドレス
  • awsに登録したことがないクレジットカード

登録ができたらGoogleカレンダーとかで翌年の前月末日に予定・アラームを作成しておくのが良いと思います。身に覚えのない請求が来ないように..

 

Railsで使いそうなAWS無料枠

使いそうな無料枠は

の下記3つだと思います。

有料枠(?)だとその人の気合い次第という気もしますが

  • ACM
  • ECR
  • ECS ( Fargate )
  • EKS
  • ELB
  • KMS
  • Route53
  • SSM

あたりかと思います。

 

 

 注意点(自分なりの)

単純な内容です。できるだけ間違えないようにするためのメモです。

  • クレジットカードは Visa か MasterCardにする(JCBだと支払通貨の表示設定を変更できない)
  • (ルート)アカウント名とIAMユーザのアカウント名を区別しやすい名前にする
  • MFAは必ず導入する(セキュリティ対策は死ぬほど大事!!)

 

 

【本題】AWSアカウント作成、諸設定(リンクのみ)

基本的には下記のリンクを参考にすれば問題ないと思います(LGTM 3663!! in 20-08-16)

ただ気をつけておきたいこと(私がはまったポイント)は

 

 

qiita.com

ちなみに私はAWSアカウントへ二段階認証を導入する際、"Authy"というアプリを使用しました。

Authyで設定する際は下記を参考にしました(中央あたりにmyハマりポイントの解決法が書いてありました)

AWS IAMとAuthyによる二段階認証を設定する - Qiita

 

とりあえずざっとこんな感じです...

 

以上!!!

 

 

 

 

RSpecで知らなかったこと

TL;DR

  • まだまだ知らないことがたくさんある(と思う)

開発環境

  • MacOS: Mojave
  • Ruby: 2.5.7
  • Rails: 5.1.7
  • BootStrap4(classは適宜変更してください)
  • Dockerを使用

備忘録にする理由

  • EverydayRailsだけの知識では対応できなかった
    • 多分のっていなかったはず
    • もしかしたら忘れているだけかも、あしからず(m m)
  • 調べるのにとっても時間がかかったため




分かったこと

factoryファイルで関連するモデルのインスタンスを先に作成できる

  • 調べ方が悪かったかも(rspec relation 関連モデル 先に作成で調べてた)
  • relationではなくassociationとしていたらすぐ見つかったかも
  • modelファイルで関連付けができていたら
FactoryBot.define do
  factory :post do
    association :comment
    user { comment.user }
    body: "postの内容です"
  end
end

下記はシンプルでわかりやすかった

【FactoryBot】associationの使い方 - Qiita

【追記】

  • EverydayRailsに下記と同じ書き方が書いてあったかも。。。こちらでも同じことができるみたい
  • とてもわかりやすい (<- EverydayRailsを読んでいればスッと頭の中に入ってくる)

以上!!

RequestSpecのテスト項目めも

TL;DR

  • ここに示すのはテストする項目だけ、詳細はこの記事がとてもわかりやすかった
  • new, editアクションはFeature(System)Specと要相談な感じ

開発環境

  • MacOS: Mojave
  • Ruby: 2.5.7
  • Rails: 5.1.7
  • BootStrap4(classは適宜変更してください)
  • Dockerを使用




本題

注意点




テストすべき内容

テストすべき内容は主に下記の項目

  • Webリクエストが成功したか
  • 正しいページにリダイレクトされたか
  • ユーザー認証が成功したか
  • レスポンスのテンプレートに正しいオブジェクトが保存されたか
  • ビューに表示されたメッセージは適切か

ちなみにshow, editアクションのエラーを返す、表示されること(ActiveRecord::RecordNotFound)はテストをしなくてもよい(らしい)

【追記】requestテストでの確認項目は、statusとbodyだけで問題ないとする人もいる?




アクションごとに項目をあげる

indexアクション(GET#index)



showアクション(GET#show)



newアクション(GET#new)
  • リクエストが成功すること
  • newテンプレートで表示されること(<- ControllerSpec)



createアクション(POST#create)
  • パラメーターが妥当な場合
    • リクエストが成功すること
    • 新規レコードが保存されること
    • (妥当なページへ)リダイレクトすること
  • パラメーターが不正な場合
    • リクエストが成功すること
    • 新規レコードが保存されないこと
    • エラーを返す、表示されること(ActiveRecord::RecordNotFound)



editアクション(GET#edit)



updateアクション(POST#update)
  • パラメーターが妥当な場合
    • リクエストが成功すること
    • 既存レコードが更新されること
    • (妥当なページへ)リダイレクトすること
  • パラメーターが不正な場合
    • リクエストが成功すること
    • 既存レコードが更新されないこと
    • エラーを返す、表示されること(ActiveRecord::RecordNotFound)



destroyアクション(DELETE#destroy)
  • リクエストが成功すること
  • 既存レコードが削除されること
    • (妥当なページへ)リダイレクトすること



以上!!

複数モデルに同時にレコードを作成する(accepts_nested_attributes_forで1対1 ~has_one, belongs_to~ を扱う)

複数モデルに同時登録するときはaccepts_nested_attributes_forが便利。
ですが、ちょこちょこ実装するのにミスがあり、半日以上かかってしまった(m m) エラーが起きた原因と解決策をざっくりとまとめました。

TD:TR;

開発環境

ざっくり備忘録にする理由

  • いろんな記事を参考にしてもそれとは違うエラー原因だった
  • エラー解決まで非常に時間を要したため

ざっくりとした全体像

前準備

アプリ作成、DB作成

# gemのインストールする場所を指定
bundle config set path 'vendor/bundle';
# railsをインストール
gem install -v 5.1.7 rails
# railsアプリを作成
rails _5.1.7_ new tmp_app --database=mysql;
# DB作成
rails db:create
# userモデルの作成
rails g scaffold User name:string;
# birthモデルの作成
rails g scaffold Birth area:string;
# migrationの実行
rails db:migrate



先に完成後のコード一覧

  • ざっくりと大事そうなとこだけ載せてる
  • フォームはUserモデル側で作成してある
  • 以下は省略
    • viewファイル(index, create, show, update, destroy)
    • BirthモデルにUserの外部キーを追加すること

app/models/user.rb

class User < ApplicationRecord
  has_one: birth, inverse_of: user
  accepts_nested_attributes_for :birth, update_only: true
end

app/models/birth.rb

class Birth < ApplicationRecord
  beglongs_to: user, inverse_of: birth
end

app/views/users/new.html.erb

<%= form_with(model: @user, url: user_path, local: true) do |form| %>
  <%= render 'user_form', {form: form , user: @user} %>
  <div>
    <%= form.submit %>
  </div>
<% end %>

app/views/users/_user_form.html.erb

    <div class="form-group">
      <%= form.label :name %>
      <%= form.text_field :name, id: :user_name %>
    </div>
  
    <%= form.fields_for :birth do |d| %>
    <%# エリア %>
    <div class="form-group">
      <%= d.label :area %>
      <%= d.text_field :area %>
    </div>
  
    <% end %>

app/controllers/users_controllers.rb

class UsersController < ApplicationController
  before_action :set_user, only: [:edit, :update]
  def index
    @users = User.all
  end

  def new
    @user = User.new
    @user.build_birth
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to users_path, flash: { notice: "作成されました" }
    else
      render 'new'
    end
  end

  def edit
  end

  def update
    if @user.update(user_params)
      redirect_to users_path, flash: { notice: "変更されました" }
    else
      render 'edit'
    end
  end

  private
  def set_user
    @user = User.find(params[:id])
  end

  def user_params
    params.require(:user).permit(:name, birth_attributes: [:area])
  end
end

エラーとその解決法

問題点1(エラー ActiveModel::UnknownAttributeError - unknown attribute 'xxx_id' for yyy.)

# app/controllers/users_controllers.rb
:
def new
  @user = User.new
  # ↓↓↓ ここでエラーが発生
  @user.build_birth
end
:

問題点1の原因と解決法

  • DB設計が原因(Birthに外部キーをつけ忘れる ~user_id~)
  • Birthモデルに外部キー(user_id)を追加する(migrationファイルで編集・修正する)ことでエラーが解消される(newアクションが表示される)

作成時(bad)

user Birth
id id
name area

修正後(good)

user Birth
id id
name area
user_id



問題点2(エラー ActiveRecord::RecordNotSaved - Failed to remove the existing associated nutrient. The record failed to save after its foreign key was set to nil)

問題点2の原因と解決法

  • ただしエラーの原因はeditアクション
    • newアクションではbuild_yyyメソッドは問題ないが、editアクションでは必要ない(-> 削除する)
# app/controllers/users_controllers.rb
:
def edit
  # ↓↓↓ ここでエラーが発生(必要なかった)
  @user.build_birth
end
:
  • モデルでinverse_ofを上手いこと定義すると、userインスタンスに関連するbirthレコードを取得してきてくれる
  • たぶんこれで大丈夫
  • app/models/user.rb
class User < ApplicationRecord
  has_one: birth, inverse_of: user
  accepts_nested_attributes_for :birth, update_only: true
end
  • app/models/birth.rb
class Birth < ApplicationRecord
  beglongs_to: user, inverse_of: birth
end


<br>
<br>



 以上!!

個人的にRailsでよく使うあれこれ

開発環境

共通

プログラミングでよく使う英単語のまとめ【随時更新】 - Qiita

  • ここは命名に迷ったときに使えそう


Rails

View

複数のモデルに1つのformで登録する

formのsubmitのデザインを変更する(BootStrap4)

# before
<%= form.submit %>
# after
<%= form.submit '保存',class: 'btn btn-primary btn-lg my-1 mb-5 px-5' %>
# or
<%= form.submit class: 'btn btn-secondary' %>




formにbootstrap4を適用する

Model

association(関連付け)

gem

discard(論理削除を実装する)

RSpec

describe, context, it(条件分岐)の使い方

よく忘れるのでメモ - RSpec コントローラのテストの書き方まとめ - Qiita

  • describe : テスト対象が何か
  • context : 条件は何か (with or whenから始める)
  • it : アウトプットは何か
# e.g. showアクション
describe "GET show" do
    context "when @book.author present" do
        it "render assings author to @author"
    end
end

--skip-yarnしたRailsアプリ(プロジェクト)に後からyarnを追加する

TD;TR;

  • yarnをスキップするオプションを付加したことを後悔した
  • オプションはある程度わかった上でつけるのがbetter(分からないならつけない)
  • ggりかたも大事

開発環境

経緯

  1. admin-lte3なる管理画面を使いたくなった - AdminLTE2をRails5.1/yarnで動かす - Qiita
  2. この記事(【Rails入門】YarnでjQueryとBootstrapを使うには!? | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイトを)参考に実現しようとしたが全くできなかった

ので備忘録。

Railsアプリを作るときに--skip-yarnオプションを付加した

下記の2つの理由からオプションを付加しました。

  1. 4.2で使った機能があれば十分だと思った
  2. アプリのパフォーマンスが下がるかもしれない(勝手な憶測)

他にもcoffeescript, turbolinks関連のオプションを付加しています。

後からどうしても欲しくなった

アプリをある程度作っていると管理画面が欲しくなりましたが

  • 管理画面を作るのがとても時間がかかりそう
  • カスタマイズしやすい管理画面をつくるためのいい感じのgemがなかった
  • Rails5.1から追加されたyarnを使えば工数の短縮につながる

という結論に至り後から導入することに決めました。

解決するために

1.完全にハマった

導入しやすそうな記事があったので参考に進めてみたが、全くうまくいかないので色々ggりました - 【Rails入門】YarnでjQueryとBootstrapを使うには!? | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

2.とりあえずyarnをインストールする

  1. yarnは必須なのでDockerfileにリンクを参考にコードを追記して - docker for macでrails × yarn × webpackerのfront環境を整える - Qiita
  2. docker-compose buildを実行しても
  3. ERROR: Service 'web' failed to build: ADD failed: stat /var/lib/docker/tmp/docker-builder922711295/package.json: no such file or directoryと怒られるので
  4. package.jsonを作成してあげる
  5. docker-compose buildを実行 -> yarnをインストールできた!!

3.yarnコマンドでモジュールを追加しても反映されない

これが一番辛かった...

  • yarnコマンドで追加してもcssにbootstrapのデザインが反映されない

その他いろいろエラーが出たのですがほぼ覚えていません(m m)

3.ggりかたを変える

反映されない理由が分からずとにかくdokcer rails yarn ~~~ みたいな感じでggってましたが、dockerを外してggってみみると良さげな記事が出てきたので

  1. guguru1 - rails yarn 追加 - Google 検索
  2. すると良さげな記事がでてきた - rails に yarn で jquery を導入 | office-aship
  3. 内容を見てみると下記のような内容だった
  4. 通常はnode_modulesの中にパッケージが反映される
  5. --skip-yarnオプションをつけると
    • 作成するための設定ファイルbin/yarnファイルが追加されない
    • config/initializers/assets.rbに必要な記述がされない

無事解決!!

...とすぐにはならなかった。

  • 原因はbin/yarnファイルにあった
    • 最初はbin/yarnファイルを作成、仮で作ったrails5.1からコピペしてきた -> node_modulesフォルダが追加されなかった
    • 最初はbin/yarnファイルを仮で作ったrails5.1からドラッグ&ドロップしたら動作するようになった

自作ポートフォリオの決定・検討事項

決定事項

検討事項

余裕があったら修正などをする

  • ログイン等のフォームを画面中央にセットする
  • deviseのパスワードリセット機能の実装

_links.html.erbの中身について

_links.html.erbとは

Railsでよく使うgem devise でジェネレータコマンドを実行すると自動生成されるファイルです。

Deviseとは

個人開発で使っていない人はいないんじゃないかというぐらい便利な認証系を簡単に実装できるgemです。

ユーザー登録して、送られてきたメールのリンクをクリックして本登録して、ログインして、パスワード忘れたら再設定して、何回もログインミスったらアカウントロックして…などといった認証系アプリに必要な機能を簡単に追加できる便利なgemです。 [Rails] deviseの使い方(rails5版) - Qiita

なぜ書くつもりになったのか?

理由は

  • 個別ページで_links.html.erbの中のリンクをコピペすることがある
  • if文とcontrollerの記述が多くて探すのに少しだけ時間がかかる(ときどき忘れる)

といった感じです。

今回はコードだけ掲載しておけば大丈夫だと思うので下記を参考にすればいいと思います。

<%# ログイン(sessions/new) %>
<%- if controller_name != 'sessions' %>
  <%= link_to "Log in", new_session_path(resource_name) %><br />
<% end %>
<%# 新規登録(registrations/new) %>
<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
  <%= link_to "Sign up", new_registration_path(resource_name) %><br />
<% end %>
<%# パスワードを忘れた場合(passwords/new)) %>
<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
  <%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
<% end %>
<%# 確認メールを受け取っていない場合or再送(confirmations/new) %>
<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
  <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %><br />
<% end %>
<%# アカウントロックを解除するためのメール送信画面(unlocks/new.html.erb) %>
<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
  <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br />
<% end %>

<%# SNS系による認証(各SNSのAPIkeyなどが必要にあなる) %>
<%- if devise_mapping.omniauthable? %>
  <%- resource_class.omniauth_providers.each do |provider| %>
    <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider) %><br />
  <% end %>
<% end %>

VSCodeでRuboCopによる警告文一覧(随時追加)

共通(?)

Favor modifier if usage when having a single-line body. Another good alternative is the usage of control flow &&/||.

Align the keys of a hash literal if they span more than one line.

Please use Rails.root.join('path/to') instead.

  • Rails/FilePathで制御
  • 相対パスで書き直してねという警告
  • 私はオフにしています
# bad
Dir[Rails.root.join('spec', 'support', '**', '*.rb')]
# good
Dir[Rails.root.join('spec/support/**/*.rb')]




Align the arguments of a method call if they span more than one line.

  • Layout/ArgumentAlignmentで制御
  • メソッド呼び出しの引数が複数行にわたる場合は、それらを揃えてねという内容
  • 私の場合はgem seed_fuを使用するときに表示されました
# bad
Unit.seed_once(:id,
  { id: 1, name: "なし" },
)

# good
Unit.seed_once(
  :id,
  { id: 1, name: "なし" },
)




DB関連

You can use change_table :xxxs, bulk: true to combine alter queries

remove_column(without type) is not reversible.

Method definitions must not be nested. Use lambda instead.

Uniqueness validation should be with a unique index.

  • Rails/UniqueValidationWithoutIndexで制御
  • modelファイルのvalidation編集時に表示
  • modelの記述とDBの定義が矛盾しているときに表示する

    RDBMSのunique indexがついていないカラムに対して、Active Recordのレイヤーでuniquenessバリデーションを書いている場合に警告をします。 - Rails/UniqueValidationWithoutIndex copを追加した - pockestrap


Specify an :inverse_of option.

Specify a :dependent option.

RSpec

Start context description with 'when', 'with', or 'without'.

  • RSpec/ContextWordingで制御
  • contextを使うときは'when','with', 'without'のどれかを説明の最初につけてねという警告


Example has too many lines [x/y].

  • RSpec/ExampleLengthで制御
  • Example(it)1つに色々つめこみすぎ、やること絞ってねという警告
  • 場合によっては詰め込みたい場合もあるからspecの種類ごとに除外しても良いかも


Example has too many expectations [x/y]

  • RSpec/MultipleExpectationsで制御
  • expect構文を使いすぎるな(it 1つにつき expect 1つだよ)という警告




参考サイト

Railsアプリ作成するときに重宝しているリンクまとめ(Rails, RSpec, VSCode etc... 随時追加)

Rails

Model(ActiveRecord関連)

rails generate migrationコマンドまとめ - Qiita

DBをいじるときは誰でも一度は目に止まってる(と思うくらい網羅してる)。

  • テーブル作成・削除
  • テーブルで指定できる型について
  • マイグレーション実行やロールバック・確認方法
  • テーブル名変更
  • 既存カラム名の追加・変更・削除(index,外部キーなど)
  • カラムにつけるオプション
    • not null(NULL制約)
    • index(インデックス)
    • default(デフォルト)
    • unique(一意制制約)
    • limit(長さ)
    • precision(小数部の精度)
    • comment(コメント、rails5以降)
  • ポリモーフィック の作成


enumを使用する

Railsでモデルのカラムのデフォルト値をセットする方法 - 動かざることバグの如し

  • DBにはデフォルト制約(?)的なものを付けれる
  • じゃあActiveRecordでの初期値を入力させるなら? -> 簡単に実装できる(ただしRails5以上)


応用編(番外編)

【保存版】技術書の読み方について - 銀行員からのRailsエンジニア

この方のブログはRailsを使っている人(初心者メイン)なら読者になる価値があると思う


Railsアプリケーション構築ガイド — Railsアプリケーション構築ガイド

  • 結構ハードルが高く感じます
  • でもかなり充実してます
  • 読めるようになってくるとなおやってることすごい!!と感じるw


BootStrap

プログレスバーの中央に文字を表示する

RSpec

パパっと試す

Rails 5.1以降のシステムテストをRSpecで実行する(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社

  • macOSRailsアプリの作成 ~ SystemSpecのテストのやり方 までサクッと書いてある
  • gem database_cleaner 使っていたが外す場合はこちら - database[Railsアプリからdatabase_cleanerを外したらRSpecが30%速くなった話 - Qiita](https://qiita.com/ham0215/items/7516117df87d2631e31d)


初期データの投入

Railsアプリのマスターデータ管理 Seed Fu ベタープラクティス - ナガモト の blog

  • 2019-06-25の記事
  • gem seed-fuを使って利用

環境構築

あとで自分なりにまとめたコードをアップします(現在未実装)




VSCode

下記リンクはWindowsを使用しているようですが、非常に参考になります。

キーボードから手を離さずにVS Codeで開発したいという気持ちを大切にしています – 10bace LOG

サイドバーを表示 / 非表示にする

  • cmd + b


サイドバーのフォルダ(ファイル構成)の表示を全て折りたたむショートカットキー

コードを折りたたむショートカットキー

コードが大量になってくると取り掛かる部分だけに集中したい時に使ってます。 ショートカットキーはデフォルトで用意されています。
おりたたむときはcmd + k, cmd + 8、逆に開くときはcmd + k, cmd + 9 -> ショートカットコマンドが変わりました(いつ変わったかは知りませんw)。 詳細は下記のサイトで見ることができます(もしかしたら変わるかもしれません...)

keyboard-shortcuts-macos.pdf

私の場合は、いったんコードを全て折りたたみ再度展開すると中のコードは折りたたまれているので対象の部分だけ表示する時に使います。 ちなみに自分が使っているところだけ抜粋すると下記の2つです。

  • 全てのコードを折りたたむ場合はcmd + k, cmd + 0、展開する場合はcmd + k, cmd + j

  • 部分的にコードを折りたたむ場合はcmd + k, cmd + [、展開する場合はcmd + k, cmd + ]




VSCodeのシェルを開くショートカットキー

  • shift + control + ^


Railsアプリ作成するときに遭遇したエラーたち(随時追加、Docker環境含む)

Ruby

can't add a new key into hash during iteration

Railsのcontrollerでデータを加工しようとした時に発生したエラー。 eachで回してる最中に回してる配列をいじっちゃいけないみたいです(m m)

  • 私は別にhashを宣言してそこに値をぶち込むことで解決しました(直接的な解決策ではないです)

下記のサイトはとても丁寧にエラーの原因が説明されています。

Rails環境構築・作成時のエラー

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.Make sure that gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/' succeeds before bundling.

rails new もしくは bundle installするときに下記のエラーが発生した

2 warnings generated.
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Rails

{:class=>"form-control"} is not a symbol nor a string

<!-- bad(error) -->
<%= f.collection_select(:difficulty, Cuisine.difficulties.keys.map{|k| [ k , k]}, {prompt: "選択してください", required: true}, {class: 'form-control'}) %>
<!-- good(no error) -->
<%= f.select(:difficulty, Cuisine.difficulties.keys.map{|k| [ k , k]}, {prompt: "選択してください", required: true}, {class: 'form-control'}) %>

ActionView::Template::Error - nil is not a valid asset source

<!-- Rails4 までok -->
<%= image_tag(user.image , class: "responsive-img") %>

<!-- Rails5 からは下記の書き方で -->
<%= image_tag(user.image , class: "responsive-img") unless user.image.blank?%>




ActionView::Template::Error - undefined method `stringify_keys'

  • Viewのヘルパーで発生したエラー
  • link_to ヘルパーをブロックで使用するときに 文字列を削除し忘れた時に発生
  • link_to 直後の文字列を削除してあげればエラーが発生しなくなりました
<!--NG-->
<%= link_to '詳細', xxx_path(xxx),  do %>
  aaa
<% end %>
<!--OK-->
<%= link_to xxx_path(xxx),  do %>
  aaa
<% end %>

ActionView::Template::Error at /xxx - undefined method `yyy' for nil:NilClass

  • Viewの association関連のエラー
  • 書き方が合っていても怒られる場合がある(今回がそれ)
  • 原因はデータの整合性がとれていないこと(今回はseedデータの作成データにズレが生じた)
    • foodcategory:1 - N:foodstuff
    • foodstuffsレコードのfoodcategory_idに存在しない値が入っていた
    • 該当するレコードを修正 or 削除すればエラーが解消される
  • seedデータは開発中のデータに問題がなければそれを取り込んだ方が良いかも


ActiveRecord::NoEnvironmentInSchemaError:

rails aborted!
ActiveRecord::NoEnvironmentInSchemaError:

Environment data not found in the schema. To resolve this issue, run:

        bin/rails db:environment:set RAILS_ENV=development

/usr/local/bundle/gems/activerecord-5.1.7/lib/active_record/migration.rb:1275:in `last_stored_environment'
/usr/local/bundle/gems/activerecord-5.1.7/lib/active_record/tasks/database_tasks.rb:56:in `check_protected_environments!'
/usr/local/bundle/gems/activerecord-5.1.7/lib/active_record/railties/databases.rake:11:in `block (2 levels) in <top (required)>'
/usr/local/bundle/gems/railties-5.1.7/lib/rails/commands/rake/rake_command.rb:21:in `block in perform'
/usr/local/bundle/gems/railties-5.1.7/lib/rails/commands/rake/rake_command.rb:18:in `perform'
/usr/local/bundle/gems/railties-5.1.7/lib/rails/command.rb:46:in `invoke'
/usr/local/bundle/gems/railties-5.1.7/lib/rails/commands.rb:16:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:migrate:reset => db:drop => db:check_protected_environments



Association named 'xxx' was not found on yyy; perhaps you misspelled it?

  • viewファイルを表示するときに発生
  • yyyモデルにはxxxていうモデルと関連付けがないよ: もしかしたらつづりミスかもという内容
  • model同士の関連付け(has_one, has_many, belongs_toなど)が記述してあるか
  • 書いてあったらスペルミスがないかチェックすればだいたい大丈夫


Errno::EIO: Input/output error

Routing Error(No route matches [GET] "/sign_out")

  • deviseのログアウトで発生(他のdestroyアクション全てでも発生した)
  • 原因は不明(いきなり上記のエラーが発生)
  • ここを参考にしました - No route matches [DELETE] "/users/sign_out" エラー(Rails) - Qiita
  • 私の場合は下記の修正のみでOKでした
    • ※修正したらサーバーを再起動させる
# before
config.sign_out_via = :delete

# after
config.sign_out_via = :get



Routing Error(No route matches [GET] "/xxx")

# before
<%= link_to '削除', xxx_path(fc.id), method: :delete %>
# after
<%= button_to '削除', xxx_path(fc.id), method: :delete %>



SystemStackError at xxx stack level too deep

  • 部分テンプレートが同じ部分テンプレートファイルを呼び出す無限ループ文を書いていた(コピペが原因)
    • e.g
      • aaas/new.html.erb内の <%= render 'aaa_form', {form: form ,aaa: @aaa} %>のrender元のファイル_aaa_form.html.erbの中で<%= render 'aaa_form', {form: form ,aaa: @aaa} %>を書いていた
  • 私の場合はこんな高度なお話ではありません

Docker

Named volume "yarn-cache:/usr/local/share/.cache/yarn/v6:rw" is used in service "web" but no declaration was found in the volumes section

# bad
version: '3.7'
services:
  db:
:
    volumes:
      - db-data:/var/lib/mysql
  web:
:
    volumes:
      - .:/webapp
      - yarn-cache:/usr/local/share/.cache/yarn/v6
:
volumes:
  db-data:

# good
version: '3.7'
services:
  db:
:
    volumes:
      - db-data:/var/lib/mysql
  web:
:
    volumes:
      - .:/webapp
      - yarn-cache:/usr/local/share/.cache/yarn/v6
:
volumes:
  db-data:
  yarn-cache:

エラーではないけれど

destroyアクション(DELETEメソッド)を要求したのにGETメソッドが送信される。

// app/javascript/packs/application.js
import Rails from 'rails-ujs/lib/assets/compiled/rails-ujs'
:
:
Rails.start()

はじめに

このブログは33才の男がWEBエンジニアに転職するまでの記録を残すためのblogです。
現在は事務職で働いていますが、時間を見つけてはRailsポートフォリオを作成したり、欲しい機能などの調べ物をしたりしてます。