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
参考記事:
GitHubのforkとclone
GitHubのforkとclone
forkとは?
第三者のリポジトリを自分のリモートリポジトリにコピーすること
cloneとは?
forkの手順
forkしたい第三者のGitHubのリポジトリに行き、右上にあるforkをクリックする
cloneの手順
下記の画像のようにcloneしたいリポジトリを開き、CodeをクリックするとCloneする為のURLが出てくるので、そのURLをコピーする
↓
ターミナルを立ち上げ、cloneしたいフォルダに移動して下記コマンドを実行
$ git clone コピーしたURL
上記コマンドを実行すると、移動したフォルダの中にcloneしたファイルがある
参考記事:
【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
参考記事:
DBの構造を直接確認する方法
DBの構造を直接確認する方法
[schema.rb]で確認できるのは、Railsが作成したDBの設計図だが、直接DBの設計図を確認する方法は以下になる。
[]
$ 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>
上記の記述でも問題ないような感じがするが、実は問題がありタグの中に
[app/views ファイル] <%= link_to (t 'defaults.edit_button'), edit_admin_board_path(board), class: "btn btn-success" %>
<a class="btn btn-success" href="/admin/users/25/edit">編集</a>
参考記事:
セレクトボックスの実装
セレクトボックスの実装
下記のようなセレクトボックスを実装する方法です
セレクトボックスの記述は、以下のようになる
<%= f.select 属性, 選択肢の集合, {オプション}, {HTMLオプション} %>
もしくは
<%= f.select( 属性, 選択肢の集合, {オプション}, {HTMLオプション} ) %>
ex)
<%= f.select :role, {'一般': 0, '管理者': 1}, { include_blank: '指定なし' }, class: 'form-control' %> :roleは、属性部分で対応するカラム名を記載する {'一般': 0, '管理者': 1}は、選択肢の集合部分 { include_blank: '指定なし' }は、初期状態の選択肢で選択肢の1番上にくるもの(選択肢の1番上にくる表記を無くして、選択肢だけにしたい場合は{}と空欄で記載する)
下記のコードは、セレクトボックスを使って[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