TECH CAMP 23日目 とりあえず作れはしたが

自分用のアウトプット。

と言っても、今まで作ってた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を終わらせたい…!

シェアする

  • このエントリーをはてなブックマークに追加

フォローする