プログラミング未経験おじさんの備忘録

本ブログはプログラミング未経験者の拙い学習の記録です。

学習[76]日目:メッセージ送信機能の実装

本日の学習内容

だいぶ期間が空いた更新となってしまいました。

 

メッセージ送信機能の実装

まず、メッセージモデルの作成を行い、マイグレーションファイルにてのカラムの編集や設定を行い、テーブルを作成します。

さらに、各モデルにアソシエーションの設定やバリデーションの設定を実施します。

メッセージコントローラーのルーティングに関しても編集を行いますが、今回は入力フォームをトップページにて行う仕様のため、newアクションの設定は行いません。(コントローラーではindexとcreateのみ定義、ルーティングもresourceでindexとcreateのみ)

上記に記載したようにmessagesコントローラで必要となるアクションはindexとcreateの2つです。

private以下にset_groupを定義し、before_actionを利用して呼び出すことで、messagesコントローラの全てのアクションで@groupを利用可能にします。

indexでは、Messageモデルの新しいインスタンスである@message、グループに所属する全てのメッセージである@messagesを定義して、n + 1 問題を避けるために、includes(:user)の記述します。

createでは、グループ作成機能を実装した際と同様に、保存に成功した場合、保存に失敗した場合で処理を分岐させます。

次いでメッセージのフォームを作成しますが、form_forの引数に@group, @messageの2つを渡している点に注目してみます。

今回の場合、messagesはgroupsにネストされているため、createアクションのパスはgroup_messages_pathに変化している為、「form_for @message」と記述したのみでは、messages_pathにリクエストを送ってしまうため、レコードを保存することができません。

「form_for [@group, @message]」と記述することで、group_messages_pathにリクエストを送ることができます。このように、ネストされたモデルに対してform_forを使用する場合、親モデルのインスタンス(もしくは親モデルのid)を第1引数、子モデルのインスタンスを第2引数に設定する必要があります。

実装するにあたり、調べたことをメモ代わりにまとめました。

Active Record コールバックとは

オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのことです。

Railsアプリケーションを普通に操作すると、その内部でオブジェクトが作成されたり、更新されたりします。Active Recordはこのオブジェクトライフサイクルへのフックを提供しており、これを用いてアプリケーションやデータを制御できます。

validate条件分岐

:if

 validates :textpresence: trueif: :user_signed_in?

上記の条件式はifがtrue、すなわちユーザーがログイン状態の時のみに検証を実行するような場合の記述になります。

:unless

validates :contentpresence: trueunless: :image?

上記の条件式のunlessはifとは反対にfalseの時、すなわちイメージが送信されていない場合に検証を実行するような場合でつまり送信した内容にイメージとテキストの両方が空の状態を避けるための検証を実行する為の記述になります。

 

render

 

ビューファイル内でテンプレートを呼び出す際には、下記のように_と拡張子除いた形で呼び出します。

<%= render partial: ‘message’ %>

部分テンプレート内で変数を使いたい時には、

<%= render partial: ‘messsage’, locals: { message: @message } %>

 

のように、localsオプションを用いて、
locals: { 部分テンプレート内で使いたい変数: 持っていきたい値 }と記述します。

 部分テンプレート内で繰り返し処理を行いたい時には、

<%= render partial: ‘message’, collection: @messages %>

↓省略形

<%= render @message %>

とcollectionオプションにインスタンス変数の複数形を渡すと、部分テンプレートでインスタンス変数が個別で呼ばれ、さらにeach文を使用せずに繰り返し処理も行ってくれます。ただし、呼び出すファイル名がインスタンス変数の単数形である必要があります。

carrierwave

画僧のアップロード機能を実装出来るジェム

minimagick

画像のリサイズを行うことが出来るジェム

学んだ英語

cache キャッシュ

relevant extension 関連する拡張子

 

参照:https://github.com/carrierwaveuploader/carrierwave

  :https://github.com/minimagick/minimagick

  :https://railsguides.jp/active_record_callbacks.html

  :https://qiita.com/yk-nakamura/items/acd071f16cda844579b9

  :https://www.pikawaka.com/rails/validation

  :https://www.pikawaka.com/rails/migration

  :https://haayaaa.hatenablog.com/entry/2018/11/25/100707