参考になりそうな記事リンク一覧
カテゴリ別
HTML, CSS共通
- 時間があったらこれをもとに作ってみたい
- 中途半場に覚えてる人はこのリンクがいいかも
【保存版】Webフロントエンド基礎力(初心者向け) - Qiita
- HTML, CSS, JSが少し書けるようになったら読んだ方がよさそう
HTML
- abbr, address, cite, del, dfn, insなど面白いタグのサンプルが見れる
- フォームのわかりやすさ・使いやすさを書いている
CSS
- リンク切れ画像にCSS指定(こんなことができるのか)
- 余白の設定の仕方(margin, paddingについて)
- 結論としては左と上にmargin or paddingをフロントエンドのプロ直伝! CSS余白設定の三原則(+線の引き方) - Qiita
デザイン(BootStrap含む)
- このどちらかでやってみたい
- フォント
-
- たくさんありすぎるフォントの種類のおおまかな違い
- 必読(BootStrapの記事ではない)
- Bootsnipp, CODEPLY, layoutit!, Bootstraup Studio は稼働しています(2020/8月現在)
- パーツなどを参考にするのはアリかも
- フロントエンジニア・デザイナーに頼む時に気をつけること
JavaScript
- 必読
- JavaScript全体の学習方法がわかるかも...
- ただし対象者は 新卒2~3年目の若手フロントエンドエンジニアやフロント分野に苦手意識のあるバックエンドエンジニアの方を対象としていますと書いてある
Vue or React
ここら辺は任意だと思いますが...
とりあえず列挙だけ
- Vue(簡単な学習方法も)
- SPAのお話(Vue, React共通)
その他(個人開発などに使えそう)
- OS、デバイス、解像度のシェアは使えそう
AWS CLIバージョン 2 をインストールしようとしたら「インストールできませんでした。」と怒られた
TL;DR(3行で)
この記事でやること
AWS CLI v2
のインストール
開発環境
- MacOS(Mojave)
経緯
諸事情でOSをダウングレード、クリーンインストールした
そのときに不可視ファイルがバックアップされていなかったため最初から入れ直す必要があったのです。
AWS CLIをインストールしようと調べたらv2なるものが見つかった
下記リンクがすぐに出てきました
aws.amazon.com
その中に下記の記述があったため「今の自分の環境には最適!!」と感じてインストールしようとする
AWS CLI を使用するために Python をインストールする必要はありません。 互換性のあるPythonバージョン、仮想環境、または競合するPythonパッケージについて心配する必要はありません。*1
pkgファイルからmacにインストールしようとするも...
下記からAWSCLIV2.pkgをダウンロードして、
docs.aws.amazon.com
インストーラーを進めていき、「インストール先の選択」を
「自分専用にインストール」
に変更して進めていくと「インストールできませんでした。」と下記の画像が表示されました。
原因は「インストール先の選択」を「自分専用にインストール」にしたことが原因でした
「インストール先の選択」を「このコンピュータのすべてのユーザ用にインストール」に変更したらパスワードを求められ入力するとインストールが完了した。
コマンドラインでもインストールできる
- こちらを参考にインストールしました
- こちらの方が楽でした
$ 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.登録 から初期設定まで リンクがほとんど)
書くこと
AWS無料枠を確認する
上記で確認することができます。
少なくとも下記を守れば1年間無料で使うことができるはず...
登録ができたらGoogleカレンダーとかで翌年の前月末日に予定・アラームを作成しておくのが良いと思います。身に覚えのない請求が来ないように..
Railsで使いそうなAWS無料枠
使いそうな無料枠は
- Amazon EC2(750時間/月)
- Amazon RDS(750h/月)
- Amazon S3(5GBまで)
の下記3つだと思います。
有料枠(?)だとその人の気合い次第という気もしますが
- ACM
- ECR
- ECS ( Fargate )
- EKS
- ELB
- KMS
- Route53
- SSM
あたりかと思います。
注意点(自分なりの)
単純な内容です。できるだけ間違えないようにするためのメモです。
- クレジットカードは Visa か MasterCardにする(JCBだと支払通貨の表示設定を変更できない)
- (ルート)アカウント名とIAMユーザのアカウント名を区別しやすい名前にする
- MFAは必ず導入する(セキュリティ対策は死ぬほど大事!!)
【本題】AWSアカウント作成、諸設定(リンクのみ)
基本的には下記のリンクを参考にすれば問題ないと思います(LGTM 3663!! in 20-08-16)
ただ気をつけておきたいこと(私がはまったポイント)は
- ユーザーIDを知らなかった(IAMユーザーのサインインリンクの数字がそれ)
- ルートアカウントからログアウトした時に、IAMユーザーのサインインリンクをコピペしておけるようにする
- 個々の"IAMユーザーの追加"のあとに"グループの作成"が表示されてパニクった(ググれば先にまとめてくれる人がいる -初心者のためのAWSの使い方(1.初期設定編)|Kurita,Y.|note)
ちなみに私はAWSアカウントへ二段階認証を導入する際、"Authy"というアプリを使用しました。
Authyで設定する際は下記を参考にしました(中央あたりにmyハマりポイントの解決法が書いてありました)
AWS IAMとAuthyによる二段階認証を設定する - Qiita
とりあえずざっとこんな感じです...
以上!!!
RSpecで知らなかったこと
TL;DR
- まだまだ知らないことがたくさんある(と思う)
開発環境
備忘録にする理由
- EverydayRailsだけの知識では対応できなかった
- 多分のっていなかったはず
- もしかしたら忘れているだけかも、あしからず(m m)
- 調べるのにとっても時間がかかったため
分かったこと
factoryファイルで関連するモデルのインスタンスを先に作成できる
- 調べ方が悪かったかも(
rspec relation 関連モデル 先に作成
で調べてた) - relationではなくassociationとしていたらすぐ見つかったかも
- modelファイルで関連付けができていたら
FactoryBot.define do factory :post do association :comment user { comment.user } body: "postの内容です" end end
下記はシンプルでわかりやすかった
【追記】
- EverydayRailsに下記と同じ書き方が書いてあったかも。。。こちらでも同じことができるみたい
- とてもわかりやすい (<- EverydayRailsを読んでいればスッと頭の中に入ってくる)
- specファイルで
- 関連ファイルを同時作成
- factoryファイルで
- association(associationだけは上記記事の方がさらっと読める)の書き方
- callback
- after(:build)
- after(:create)
- specファイルで
以上!!
RequestSpecのテスト項目めも
TL;DR
- ここに示すのはテストする項目だけ、詳細はこの記事がとてもわかりやすかった
- new, editアクションはFeature(System)Specと要相談な感じ
開発環境
本題
注意点
JSON APIはControllerSpecでは使えない(というよりRequestSpecで書いた方が良い)
controller specではresponse.bodyをテストすることができません。(render_viewを呼ばない限りresponse.bodyは""になる)その為JSON APIのテストはrequest specで行うのが適切です。 indexアクションの場合は以下のような感じになるはずです。
Rails5でコントローラのテストをController specからRequest specに移行する - QiitaRSpec公式 request spec - Request specs - RSpec Rails - RSpec - Relish
テストすべき内容
テストすべき内容は主に下記の項目
- Webリクエストが成功したか
- 正しいページにリダイレクトされたか
- ユーザー認証が成功したか
- レスポンスのテンプレートに正しいオブジェクトが保存されたか
- ビューに表示されたメッセージは適切か
ちなみにshow, editアクションのエラーを返す、表示されること(ActiveRecord::RecordNotFound)
はテストをしなくてもよい(らしい)
【追記】requestテストでの確認項目は、statusとbodyだけで問題ないとする人もいる?
アクションごとに項目をあげる
indexアクション(GET#index)
showアクション(GET#show)
- インスタンスが存在する場合
- インスタンスが存在しない場合
- エラーを返す、表示されること(ActiveRecord::RecordNotFound)
newアクション(GET#new)
- リクエストが成功すること
- newテンプレートで表示されること(<- ControllerSpec)
createアクション(POST#create)
- パラメーターが妥当な場合
- リクエストが成功すること
- 新規レコードが保存されること
- (妥当なページへ)リダイレクトすること
- パラメーターが不正な場合
- リクエストが成功すること
- 新規レコードが保存されないこと
- エラーを返す、表示されること(ActiveRecord::RecordNotFound)
editアクション(GET#edit)
- インスタンスが存在する場合
- インスタンスが存在しない場合
- エラーを返す(ActiveRecord::RecordNotFound)
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設計は大事
inverse_of
オプションはつけたほうが良い(と私は思う)update_only: true
オプションも使用した- ちなみにこんなgemもあるらしい - Rails フォーム(form_for,nested_form,fields_for) による複数同時投稿(親子、親子孫、他人) - Qiita
開発環境
ざっくり備忘録にする理由
- いろんな記事を参考にしてもそれとは違うエラー原因だった
- エラー解決まで非常に時間を要したため
ざっくりとした全体像
- 今回は2モデル~1対1~間でのお話(
has_one
,belongs_to
)- user, birthモデルとする
今回は下記がメイン
- new, create, edit, updateアクションの処理
- Activerecordの書き方
テスト(Rspec)は書かない
前準備
アプリ作成、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.
)
- newアクションで
unknown attribute 'user_id' for Birth.
が発生 build_birth
メソッドでエラーが発生する- 下の記事はわかりやすかったです
build_yyy
とyyy_attributes=
について - ruby on rails - accepts_nested_attributes_forで生えたメソッドとcreateやupdateの関係性 - スタック・オーバーフロー
# 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
)
- editアクションでエラー
- accept_nested_attributes_forでまとめてuserとbirthモデルのレコードを更新しようとしているために起きるエラーみたいです
- guguruとそのまま出てきました
- 私は
- 両方のモデルに
inverse_of
オプションを指定 - [rails] accepts_nested_attributes_for の場合は、inverse_of を付けておくと良い気がする - Qiita
- 両方のモデルに
update_only: true
を選択しました(この記事はおすすめです) - has_oneの関連づけをそのまま更新しようとして "The record failed to save after its foreign key was set to nil." と言われた - Qiita
問題点2の原因と解決法
- ただしエラーの原因は
edit
アクション- newアクションでは
build_yyy
メソッドは問題ないが、editアクションでは必要ない(-> 削除する)
- newアクションでは
# 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で登録する
accepts_nested_attributes_for
が便利(5.1, form_withでも使えそう)- ただし
accepts_nested_attributes_for
はあまりよろしくないらしい- Model と画面上の form が1対1で一致しない場合、どのように実装するのが綺麗なのか? - その他 - clean-rails.org
- 週刊Railsウォッチ(20191105前編)Rails 6のデフォルト設定解説、DHHも消したいaccepts_nested_attributes_for、スライド『実践Railsアプリケーション設計』ほか|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社
- moneyfowardさんの記事 - accepts_nested_attributes_forを使わず、複数の子レコードを保存する | Money Forward Engineers' Blog
- Railsで複数モデルを扱うフォームをすっきり書く(Formオブジェクト) - LiBz Tech Blog
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(論理削除を実装する)
- 論理削除を実装してくれるgem - 「paranoia」は使用非推奨なので、論理削除に「discard」を使う(Rails) - ryotaku's Tech Blog
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りかたも大事
開発環境
経緯
admin-lte3
なる管理画面を使いたくなった - AdminLTE2をRails5.1/yarnで動かす - Qiita- この記事(【Rails入門】YarnでjQueryとBootstrapを使うには!? | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイトを)参考に実現しようとしたが全くできなかった
ので備忘録。
Railsアプリを作るときに--skip-yarn
オプションを付加した
下記の2つの理由からオプションを付加しました。
- 4.2で使った機能があれば十分だと思った
- アプリのパフォーマンスが下がるかもしれない(勝手な憶測)
他にもcoffeescript, turbolinks関連のオプションを付加しています。
後からどうしても欲しくなった
アプリをある程度作っていると管理画面が欲しくなりましたが
- 管理画面を作るのがとても時間がかかりそう
- カスタマイズしやすい管理画面をつくるためのいい感じのgemがなかった
- Rails5.1から追加されたyarnを使えば工数の短縮につながる
という結論に至り後から導入することに決めました。
解決するために
1.完全にハマった
導入しやすそうな記事があったので参考に進めてみたが、全くうまくいかないので色々ggりました - 【Rails入門】YarnでjQueryとBootstrapを使うには!? | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
2.とりあえずyarnをインストールする
- yarnは必須なのでDockerfileにリンクを参考にコードを追記して - docker for macでrails × yarn × webpackerのfront環境を整える - Qiita
docker-compose build
を実行してもERROR: Service 'web' failed to build: ADD failed: stat /var/lib/docker/tmp/docker-builder922711295/package.json: no such file or directory
と怒られるのでpackage.json
を作成してあげる- rails package.json - Google 検索
- Railsで利用するフロントエンドのライブラリをnpmからインストールする - Qiitaを参考に
package.json
を修正
docker-compose build
を実行 -> yarnをインストールできた!!
3.yarnコマンドでモジュールを追加しても反映されない
これが一番辛かった...
- yarnコマンドで追加してもcssにbootstrapのデザインが反映されない
その他いろいろエラーが出たのですがほぼ覚えていません(m m)
3.ggりかたを変える
反映されない理由が分からずとにかくdokcer rails yarn ~~~
みたいな感じでggってましたが、docker
を外してggってみみると良さげな記事が出てきたので
- guguru1 - rails yarn 追加 - Google 検索
- すると良さげな記事がでてきた - rails に yarn で jquery を導入 | office-aship
- 内容を見てみると下記のような内容だった
- 通常は
node_modules
の中にパッケージが反映される --skip-yarn
オプションをつけると- 作成するための設定ファイル
bin/yarn
ファイルが追加されない config/initializers/assets.rb
に必要な記述がされない
- 作成するための設定ファイル
無事解決!!
...とすぐにはならなかった。
- 原因は
bin/yarn
ファイルにあった- 最初は
bin/yarn
ファイルを作成、仮で作ったrails5.1からコピペしてきた ->node_modules
フォルダが追加されなかった - 最初は
bin/yarn
ファイルを仮で作ったrails5.1からドラッグ&ドロップしたら動作するようになった
- 最初は
自作ポートフォリオの決定・検討事項
決定事項
- 管理者側のボタンのクラスは
btn btn-secondary
- 管理者画面のデザインは
AdminLTE3
にする- デモページ - AdminLTE 3 | Dashboard
- 公式ドキュメント - Introduction | AdminLTE 3 Documentation
検討事項
- ユーザー側のボタンのクラスは
btn btn-success
? 論理削除をどうするか?
- 自前で実装
- gem 'discard'を使用する
ブレイクポイント、デザインのレスポンシブについてどうするか?
- 【【2020年3月】レスポンシブ CSSブレイクポイント・メディアクエリ(@media) | SEO塾/株式会社アルゴリズム
1024px以上がPC、それ以下がmobile, tabletとする
mobileは414, tabletは768,pcは960(ただしtabletとlaptopのサイズは一緒)
余裕があったら修正などをする
- ログイン等のフォームを画面中央にセットする
- 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 &&
/||
.
Style/IfUnlessModifier
で制御configroutes.rb
ファイルのletteropnerweb
関連で表示されるif分の中身が一行の場合は 後置if文を使用するか、&& or ||リテラルを使用し、処理をコントロールして下さい
ということらしい(要は行数を少なくしろってことかな?)- 【RuboCop-Linter】align the elements of a hash literal if they span more than one line.という警告に対処する - ぱふの自由帳
Align the keys of a hash literal if they span more than one line.
Layout/HashAlignment
で制御configroutes.rb
ファイルのdevise
のルーティング関連で表示される2行以上であれば要素を揃えなさい
という内容- 【RuboCop-Linter】align the elements 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
Rails/BulkChangeTable
で制御する- DBのカラム変更のmigration編集時に表示
- 警告はしてくれるけど手動で修正する必要がある
change_table
メソッドは、bulk: true
というオプションを設定できる- 使い方 - Class: RuboCop::Cop::Rails::BulkChangeTable — Documentation for rubocop (0.61.1)
- ただしできないのもある?(
t.remove_references
とか)
- ただしできないのもある?(
- 警告通りに修正するとmigrationが早くなる「change_table」で「bulk: true」を使用したマイグレーションの高速化(Rails) - ryotaku's Tech Blog
- 使い方 - Class: RuboCop::Cop::Rails::BulkChangeTable — Documentation for rubocop (0.61.1)
remove_column(without type) is not reversible.
Rails/ReversibleMigration
で制御- DBのカラム変更のmigration編集時に表示
rollbackできない書き方してるからだめだよ
と言われている
Method definitions must not be nested. Use lambda
instead.
- ???
- DBのカラム変更のmigration編集時に表示
メソッド定義はネストしないで、するならlambdaを使って
と言われている- migrationファイルでは
def change
ブロックを削除してdef up
,def down
ブロックを追加して編集する
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.
Rails/InverseOf
で制御- 挙動がおかしくなる場合があるから
inverse_of
オプションをつけてた方が良さそう - けっこう説明が難しそう
同じレコードを参照する場合に、わざわざSQLを発行せずに、既に知っているオブジェクトを使いまわせるようにするためのオプション... といったところでしょうか
RuboCopの Rails/InverseOf について調べた - sometimes I laugh - 詳しく解説されてます - RuboCopの Rails/InverseOf について調べた - sometimes I laugh
Specify a :dependent
option.
Rails/HasManyOrHasOneDependent
で制御dependentオプションを指定していない関連付けがあるよ、関連付けしてね
という警告- 基本的につけた方がいい
- ただし
dependent: :destroy
は要注意
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つだよ)
という警告
参考サイト
- Class: RuboCop::Cop::Rails::BulkChangeTable — Documentation for rubocop (0.61.1)
- 「change_table」で「bulk: true」を使用したマイグレーションの高速化(Rails) - ryotaku's Tech Blog
- Rails/UniqueValidationWithoutIndex copを追加した - pockestrap
- Rubyコラム - Dig Ruby! 第4回「RuboCop」を使用したコーディング規約管理
- 【RuboCop-Linter】align the elements of a hash literal if they span more than one line.という警告に対処する - ぱふの自由帳
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では、モデルにenumを定義することで、文字を使ってカラムの値を変更したり、反対に取り出したりできます。
繰り返しになりますが、意味のある単語を使って、操作できるのでプログラマーが開発をしやすくなります。
【Rails入門】enumの使い方まとめ | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト - 下記が分かりやすかった
- ただしバリデーションには注意
- enum validates - Google 検索 でggると下記の記事が出てきた
- rails における enum の validation - じゃるログ
Railsでモデルのカラムのデフォルト値をセットする方法 - 動かざることバグの如し
- DBにはデフォルト制約(?)的なものを付けれる
- じゃあActiveRecordでの初期値を入力させるなら? -> 簡単に実装できる(ただしRails5以上)
応用編(番外編)
【保存版】技術書の読み方について - 銀行員からのRailsエンジニア
この方のブログはRailsを使っている人(初心者メイン)なら読者になる価値があると思う
Railsアプリケーション構築ガイド — Railsアプリケーション構築ガイド
- 結構ハードルが高く感じます
- でもかなり充実してます
- 読めるようになってくるとなおやってることすごい!!と感じるw
BootStrap
プログレスバーの中央に文字を表示する
- html - ブートストラッププログレスバー—進行状況に関係なくテキストを中央に表示 - ITツールウェブ
- jqueryでプログレスバーをアニメーションで表示できます - プログレスバーを作る | Bootstrapでホームページを作る - 北海道苫小牧市のホームページ制作 STUDIO KEY
- Bootstrap4でプログレスバー作成 - Qiita
RSpec
パパっと試す
Rails 5.1以降のシステムテストをRSpecで実行する(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社
- macOSでRailsアプリの作成 ~ 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を使用しているようですが、非常に参考になります。
サイドバーを表示 / 非表示にする
cmd + b
サイドバーのフォルダ(ファイル構成)の表示を全て折りたたむショートカットキー
- これを見つけた時は感動を覚えた - visual-studio-code - ビジュアルスタジオコード - キーボードショートカット - すべてを展開/折りたたむ
- ただし設定は手動(ショートカットキーが割り当てられていない)
cmd + shift + p
orF1
Open Keyboard Shortcuts
- 検索窓に
workbench.files.action.collapseExplorerFolders
を入力 Collapse Folders in Explorer
の左の+
をクリック- 自分の好きなキーをショートカットとして登録(
cmd + j, cmd + i としました、特に意味はない-> アップデートでうまく動作しなくなったのでcmd+j, cmd+u
に変更しました)
コードを折りたたむショートカットキー
コードが大量になってくると取り掛かる部分だけに集中したい時に使ってます。
ショートカットキーはデフォルトで用意されています。
おりたたむときはcmd + k, cmd + 8、逆に開くときは -> ショートカットコマンドが変わりました(いつ変わったかは知りませんw)。
詳細は下記のサイトで見ることができます(もしかしたら変わるかもしれません...)cmd + k, cmd + 9
私の場合は、いったんコードを全て折りたたみ再度展開すると中のコードは折りたたまれているので対象の部分だけ表示する時に使います。 ちなみに自分が使っているところだけ抜粋すると下記の2つです。
全てのコードを折りたたむ場合は
cmd + k, cmd + 0
、展開する場合はcmd + k, cmd + j
部分的にコードを折りたたむ場合は
cmd + k, cmd + [
、展開する場合はcmd + k, cmd + ]
VSCodeのシェルを開くショートカットキー
shift + control + ^
Railsアプリ作成するときに遭遇したエラーたち(随時追加、Docker環境含む)
- Ruby
- Rails環境構築・作成時のエラー
- Rails
- {:class=>"form-control"} is not a symbol nor a string
- ActionView::Template::Error - nil is not a valid asset source
- ActionView::Template::Error - undefined method `stringify_keys'
- ActionView::Template::Error at /xxx - undefined method `yyy' for nil:NilClass
- ActiveRecord::NoEnvironmentInSchemaError:
- Association named 'xxx' was not found on yyy; perhaps you misspelled it?
- Errno::EIO: Input/output error
- Routing Error(No route matches [GET] "/sign_out")
- Routing Error(No route matches [GET] "/xxx")
- SystemStackError at xxx stack level too deep
- 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】MySQL2がbundle installできない時の対応方法 - Qiitaで解決できた
- 下記がとても詳しく書いてある(mysql2 gemインストール時のトラブルシュート - Qiita)
Rails
{:class=>"form-control"} is not a symbol nor a string
- Railsのフォーム入力画面で発生したエラー
- 入力値にenumを使用
- BootStrapのクラスを適用する時
{:class =>"form-control
}は記号でも文字列でもないよ`(by Google 翻訳)- そもそも
enum
を使うときはf.select
みたい(いろいろ参考)- o f.select
- x f.collection_select
- ここが分かりやすかった - Railsでenumを使ったselectタグ | 酒と涙とRubyとRailsと
<!-- 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
- Viewの
image_tag
ヘルパーによるエラー - Rails5からnilチェックが必要(unless文を追加する)
【Rails5】nil is not a valid asset source が出た時の対処法 | KANOE STUDIO
<!-- 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:
- DBをリセット(rails db:migrate:reset)しようとした時に発生(下記がエラー表示)
- Rails5以降のDB保護機能で、誤ってproduction environmentのDBを破壊してしまうのを防ぐ為の仕組みらしい - Rails 5に入ったDB破壊系taskの防止処理について | 日々雑記
- 表示の通り
bin/rails db:environment:set RAILS_ENV=development
を実行すれば解決できた - guguru
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
Errno::EXDEV: Invalid cross-device link
も同時に発生しました。- gem
seed_fu
で初期データ投入時に発生しました。 - 原因不明? 別タブでrailsを動作させていたserverを停止させて再度
rails db:seed_fu
を実行したらエラーは発生しませんでしたw - Rails3 でサーバ起動させると「Errno::EIO: Input/output error 〜 」とかなる場合のメモ - 牌語備忘録 -pygo
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")
- destroyアクションでエラー発生
- 上記のエラーが発生してから起きるように
link_to
をbutton_to
に変更すれば解決できた - No route matches [GET]の原因と解決策 - Qiita
# 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} %>
を書いていた
- e.g
- 私の場合はこんな高度なお話ではありません
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
- こんな感じでggりました - docker yarn Named volume is used in service web but no declaration was found in the volumes section. - Google 検索
- この記事と同じ原因でした(
volumes
の書き方に問題があったみたい) - ERROR: Named volume "data:/var/lib/mysql:rw" is used in service "xxxx" but no declaration was found in the volumes section. - grmn's blog - yarnだけでなくbundler、db関係でも使える
# 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:
volumes:
について怪しい場合はこちらがいいかも - Dockerにおけるボリュームのマウント - logicoffee プログラミング勉強日記
エラーではないけれど
destroyアクション(DELETEメソッド)を要求したのにGETメソッドが送信される。
- Rails5.1で発生した問題
- 下記の設定をすればDELETEメソッドとして送信されるようになりました
// app/javascript/packs/application.js import Rails from 'rails-ujs/lib/assets/compiled/rails-ujs' : : Rails.start()