RSpecのセットアップ

RSpecの使い方

RSpecの導入は、以下になります。

下記のようにGemfileに記述する
テストデータを作成する[factory_bot_rails]Gemも一緒に入れる
※[factory_bot_rails]は、テスト環境だけでなく開発環境でも rails console 等で動作確認ができるため、下記のように[development]と[test]の両方にGemを入れる

[Gemfile]

group :development, :test do
  gem 'rspec-rails', '~> 5.0.0'
  gem 'factory_bot_rails'
end


$ bundle install


下記コマンドで設定ファイルを作成

$ rails generate rspec:install


下記コマンドで対象のspecファイルを作成(下記の場合は、[spec/models/task_spec.rb]を作成)

$ rails generate rspec:model task

参考記事:

誰にとってもわかりやすいGitのコミットメッセージを考える | Tips Note by TAM

【今日からできる】コミットメッセージに 「プレフィックス」 をつけるだけで、開発効率が上がった話 - Qiita

GitHubのforkとclone

GitHubのforkとclone

forkとは?

三者リポジトリを自分のリモートリポジトリにコピーすること

cloneとは?

リモートのリポジトリをローカルのリポジトリにコピーすること

forkの手順

forkしたい第三者GitHubリポジトリに行き、右上にあるforkをクリックする

Image from Gyazo

cloneの手順

下記の画像のようにcloneしたいリポジトリを開き、CodeをクリックするとCloneする為のURLが出てくるので、そのURLをコピーする


ターミナルを立ち上げ、cloneしたいフォルダに移動して下記コマンドを実行

$ git clone コピーしたURL 上記コマンドを実行すると、移動したフォルダの中にcloneしたファイルがある

Image from Gyazo

参考記事:

リポジトリのcloneとforkの違い - Qiita

【Git初心者向け】CloneとFork、チーム開発する際にはどっちを使うべき?|TechTechMedia

GitHub – リポジトリをFork・CloneしてPull Requestを送る方法/やり方 | Howpon[ハウポン]

form_withのパラメーターの行き先の仕組み

form_withのパラメーターの行き先の仕組み

[form_with]を使うと、パラメーターの行き先をcreateアクション(POST)やupdateアクション(PATCH)などと良い感じで分けてくれるが、この仕組みを説明します。

[app/views ファイル]

<%= form_with model: @user, url: admin_user_path(@user), local: true do |f| %>

Railsは、form_withに渡しているmodelのインスタンスの状態を見てcreateアクション(POST)やupdateアクション(PATCH)などの行き先を判断している

persisted?というメソッドを使い、@new_recordと@destroyedの2つのインスタンス変数にアクセスして状態を確認している
@new_recordと@destroyedのインスタンス変数とは、作成したオブジェクトが持っているインスタンス変数
persisted?がtrueならPATCHへパラメーターが送られる
persisted?がfalseならPOSTへパラメーターが送られる

persisted?メソッドの挙動とオブジェクトが持つインスタンス変数は、以下のイメージ

# DBに保存済みのインスタンスと未保存のインスタンスを用意します。
>> persisted_user = User.first
>> new_user = User.new

# @new_recordと@destroyedというインスタンス変数を持っているのか確認します。
>> persisted_user.instance_variables
# => [:@attributes, :@aggregation_cache, :@association_cache, :@readonly, :@destroyed, :@marked_for_destruction, :@destroyed_by_association, :@new_record, :@_start_transaction_state, :@transaction_state]
>> new_user.instance_variables
# => [:@attributes, :@aggregation_cache, :@association_cache, :@readonly, :@destroyed, :@marked_for_destruction, :@destroyed_by_association, :@new_record, :@_start_transaction_state, :@transaction_state]

# それぞれのインスタンス変数の値を確認します
>> persisted_user.instance_variable_get('@new_record')
# => false
>> persisted_user.instance_variable_get('@destroyed')
# => false
>> persisted_user.persisted?
# => true

>> new_user.instance_variable_get('@new_record')
# => true
>> new_user.instance_variable_get('@destroyed')
# => false
>> new_user.persisted?
# => false

# ちなみに削除済みも確認してみる
>> destroyed_user = persisted_user.destroy
>> destroyed_user.instance_variable_get('@new_record')
# => false
>> destroyed_user.instance_variable_get('@destroyed')
# => true
> destroyed_user.persisted?
# => false

参考記事:

Rubyでオブジェクトの中身を調べてみようを現役エンジニアが解説【初心者向け】 | TechAcademyマガジン

DBの構造を直接確認する方法

DBの構造を直接確認する方法

[schema.rb]で確認できるのは、Railsが作成したDBの設計図だが、直接DBの設計図を確認する方法は以下になる。

[Image from Gyazo]

$ sqlite3 db/runteq_normal_development

今回マイグレーションファイルを調べるにあたり便利だったコマンドがありました。
addする前の状態から、直前のコミットの状態に戻すコマンドは、以下になります。

git restore ファイル名

参考記事:

第8話 switchとrestoreを使ってみよう 【連載】マンガでわかるGit ~コマンド編~ - itstaffing エンジニアスタイル

link_toの使い方について

[link_to]の使い方について

[link_to]で以下のように記述した場合と生成されるHTMLは、以下のようになる

[app/views ファイル]

      <%= link_to edit_admin_board_path(@board) do %>
        <button type="button" class="btn btn-success"><%= (t 'defaults.edit_button') %></button>
      <% end %>
<a href="/admin/boards/1/edit">
      <button type="button" class="btn btn-success">編集</button>
</a> 

上記の記述でも問題ないような感じがするが、実は問題がありタグの中に

RSpecのスクリーンショットのHTMLの確認

RSpec実行時のスクリーンショットのHTMLの確認

RSpec実行時にテストに失敗した時のスクリーンショットの確認方法は、テストが失敗したところでbinding.pryなどでテストを止めて[save_and_open_page]を実行するとHTMLが確認できる

セレクトボックスの実装

セレクトボックスの実装

下記のようなセレクトボックスを実装する方法です

Image from Gyazo

セレクトボックスの記述は、以下のようになる

<%= f.select 属性, 選択肢の集合, {オプション}, {HTMLオプション} %>

もしくは

<%= f.select( 属性, 選択肢の集合, {オプション}, {HTMLオプション} ) %>

ex)

<%= f.select :role, {'一般': 0, '管理者': 1}, { include_blank: '指定なし' }, class: 'form-control' %>

:roleは、属性部分で対応するカラム名を記載する
{'一般': 0, '管理者': 1}は、選択肢の集合部分
{ include_blank: '指定なし' }は、初期状態の選択肢で選択肢の1番上にくるもの(選択肢の1番上にくる表記を無くして、選択肢だけにしたい場合は{}と空欄で記載する)

Image from Gyazo

下記のコードは、セレクトボックスを使って[ransack]Gemによりセレクトボックスで選択した内容で検索するコードです。

[app/views ファイル]

      <%= search_form_for @q, url: admin_users_path do |f| %>
        <%= f.search_field :first_name_or_last_name_cont, class: 'form-control mr-1', placeholder: '検索ワード' %>
        <%= f.select :role_eq, { "#{(t 'defaults.general')}": 0, "#{(t 'defaults.admin')}": 1 }, { include_blank: (t '.no_select') }, class: 'form-control mr-1' %>
          <%= f.submit class: 'btn btn-primary'%>
      <% end %>
[confiig/locales/views/ja.yml]

ja:
  defaults:
    general: '一般'
    admin: '管理者'

上記記述は、[enum_help]Gemを使って以下のように記載する事ができる

[app/views ファイル]

      <%= search_form_for @q, url: admin_users_path do |f| %>
        <%= f.search_field :first_name_or_last_name_cont, class: 'form-control mr-1', placeholder: '検索ワード' %>
        <%= f.select :role_eq, User.roles_i18n.invert.map{|key, value| [key, User.roles[value]]}, { include_blank: (t '.no_select') }, class: 'form-control mr-1' %>
          <%= f.submit class: 'btn btn-primary'%>
      <% end %>

※ポイント
[f.select]は、下記のような形式で記載しなければいけないため、オプション部分が不要だからといってオプション部分を省いてはいけない。(オプション部分を省いてHTMLオプションを記載するとHTMLのオプション部分が反映されない)
<%= f.select 属性, {選択肢の集合}, {オプション}, {HTMLオプション} ) %>

参考記事:

Ruby on Railsのf.selectの使い方を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン

[Rails]Ransackでセレクトボックスを使用する方法 - Qiita

【Rails】完全理解 formでセレクトボックスをつくるselectの使い方 - WEB屋のメモ帳

【Rails】enumを使用したセレクトボックスの実装とDBへの保存 - Qiita

【Rails】enumを使用したセレクトボックスの実装とDBへの保存 - Qiita

【Rails】 enumチュートリアル | Pikawaka - ピカ1わかりやすいプログラミング用語サイト