自分用のアウトプット。
と言っても、今まで作ってたPicTweetの応用みたいな感じで、基本的なところは同じなので、改めて書いても同じ内容が多かったり。
新しく出てきたところだけをかいつまんで書いておこう。
アソシエーションについて。
room.rb
has_many :messages
user.rb
has_many :messages
投稿されたメッセージの情報をDBに保存する。
どのルームで投稿されたメッセージなのかをパスから判断できるようにするため、ルーティングのネストを利用。
routes.rb roomsのルーティングの中に
resources :messages, only:[:index, :create] を入れる
messages_controller.rb
@room = Room.find(params[:room_id])
ネストしたのでroomの中にidが含まれている。
URLは /rooms/:room_id/messages のようになる。
サイドバーのルーム名をクリックすると、メッセージ一覧が表示されるようにする。
<%= link_to room_name, room_messages_path(room) %>
(room)の部分には、メッセージと紐付いているチャットルームのidが入る。
collectionオプション
指定したインスタンス変数の中にある要素の数だけ部分テンプレートが繰り返し表示される。
<%= render partial: ‘message’, collection: @messages %>
‘message’は部分テンプレート
@messages には @room.messages.includes(:user)が入り、その
@room には Room.find(params[:room_id])が入っている。
PicTweetではeachを使っていたが、collectionを使うと一行で記述ができる。
メッセージ表示の記述について。
_message.html.erb
投稿者名表示 <%= message.user.name %> ←messagesテーブルのuser_idに紐付くname
投稿日時表示 <%= message.created_at %>
投稿内容表示 <%= message.content %>
デフォルトだと時刻表示が世界標準時になっているので、日本時間にする。
application.rbとja.ymlを編集・作成して設定。
lメソッド
日付や時刻を表示するRailsメソッド。
<%= l message.created_at %> とすると日本時間になる。
ヘッダーにチャットルーム名を表示。
<%= @room.name %>
バリデーションエラー時にサイトデザインが崩れることがある。
→application.rbを編集。
ルームの削除について。
dependentオプション
親モデルを削除したとき、関連しているモデルの挙動をどうするのか指定できる。
今回はroom(親)が削除されたときにmessageとuser(子)も削除されるようにする。
room.rb
has_many :users, through: :room_users, dependent: :destroy
has_many :messages, dependent: :destroy
画像投稿機能の実装について。
Active Storage
ファイルアップロードを簡単にできるgem。
Image Magick
コマンドラインから簡単に画像の保存形式の変更などができるツール。
下記のgemも導入。
image_processing
画像サイズの調整ができるgem。
Active Storageのテーブルと、Messagesテーブルのアソシエーションを記述する。
message.rb
has_one_attached :image
messages_controllerで、imageカラムの保存を許可する。
プライベートメソッドのmessage_paramsの定義のpermitの部分に:imageを追記。
画像表示の記述
_message.html.erb
<%= image_tag message.image, class: ‘message-image’ if message.image.attached? %>
画像が存在する場合のいimage_tagが読み込まれる。
variantメソッド
Active Storage導入時に使用可能なメソッド。
ビュー側で使用したいサイズをその都度指定できる。
保存された元画像データを指定されたサイズに変換し、そのURLを返す。
_message.html.erbで.variant(resize:’500×500′)と追記。
テキストがなくても画像がある場合はメッセージが送信できるようにする。
message.rb
バリデーションの記述部分に
,unless: :was_attached?を追記し、下記も定義。
def was_attached?
self.image.attached?
end
モデル単体テストコードを書く。
画像の生成はインスタンスに紐付ける必要がある。
インスタンス生成後に画像が保存されるようにする。
afterメソッド
任意の処理の後に指定の処理を実行できる。
after(:build)とすると、インスタンスがbuildされた後に指定の処理を実行。
ここまで!
とりあえずChatApp自体は作成完了。
今日は単体テストコード、結合テストコードを書いていきます。
今日中にはLesson6を終わらせたい…!