【六日目】ChatSpace テストコード
RSpecを使ったテストについて学んだことの忘備録。
1.まずは、テストで使うGem導入
・コントローラのテストのため、'rails-controller-testing'
・ダミーインスタンス作成のため、'factory_bot_rails'
・ダミーデータ作成のため、'faker'
をGemfileに追加。
忘れずに、bundle installでインストール。
1 2 3 4 5 6 7 8 |
2.導入したrspecをインストール。
出力を見やすくするため追加。
1 |
--format documentation
|
これでテストの準備完了。
3.FactoryBot使用
まずは、FactroyBotの記述を省略するためのコード。
1 2 3 |
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
end
|
spec/factories/users.rb
1 2 3 4 5 6 7 8 9 |
FactoryBot.define do
factory :user do
password = Faker::Internet.password(8)
name {Faker::Name.last_name}
email {Faker::Internet.free_email}
password {password}
password_confirmation {password}
end
end
|
【五日目】chatspace メッセージビュー
今日学んだことは、
・render partial
・strftime
render
レンダリングという単語から名付けられたメソッド。
テンプレートの表示を行う。
partialをオプションを使うことで、呼びだすテンプレートを指定。
collectionオプションを使うことで、データの繰り返しを出力する。
localオプションを使うことで、部分テンプレート内でその変数を利用できる。
1 |
strftime
Rubyの組み込みオブジェクト
時刻をフォーマットに従って文字列に変換
使い方
strftime(フォーマット)
フォーマット
フォーマット | 説明 |
---|---|
%A | 曜日の名称(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday) |
%a | 曜日の省略名(Sun, Mon, Tue, Wed, Thu, Fri, Sat) |
%B | 月の名称(January, February, March, April, May, June, July, August, September, October, November, December) |
%b | 月の省略名(Jan, Feb, Mar, Aprm May, Jun, Jul, Aug, Sep, Oct, Nov, Dec) |
%c | 日付と時刻 |
%d | 日(01-31) |
%H | 24時間制の時(00-23) |
%I | 12時間制の時(01-12) |
%j | 年中の通算日(001-366) |
%M | 分(00-59) |
%m | 月を表す数字(01-12) |
%p | 午前または午後(AM,PM) |
%S | 秒(00-60) (60はうるう秒) |
%U | 週を表す数。最初の日曜日が第1週の始まり(00-53) |
%W | 週を表す数。最初の月曜日が第1週の始まり(00-53) |
%w | 曜日を表す数。日曜日が0(0-6) |
%X | 時刻 |
%x | 日付 |
%Y | 西暦を表す数 |
%y | 西暦の下2桁(00-99) |
%Z | タイムゾーン |
%% |
パーセント文字 |
今日はここまで。
【四日目】chatspaceメッセージ送信機能 references型
メッセージ送信機能実装のため、モデル作成。
まずは、ターミナルでメッセージモデル作成。
1 |
$ rails g model message
|
マイグレーションファイルで、カラム設定。
1 2 3 4 5 6 7 8 9 10 11 |
class CreateMessages < ActiveRecord::Migration[5.0]
def change
create_table :messages do |t|
t.string :content
t.string :image
t.references :group, foreign_key: true
t.references :user, foreign_key: true
t.timestamps
end
end
end
|
group,userテーブルとのアソシエーション定義をする。
外部キー制約のついたカラムを追加するためにreferences型を使用するメリットは以下の通り。
1. t.references :group とすると、group_idカラム名を自動的に作ってくれる
2. indexを自動で貼ってくれる
※index:データベース機能の一つで、データの検索を高速にしてくれる仕組み。カラムに対して、インデックスを設定する。
t.references :groupだけだと、外部キー制約をつけられないので、
foreign_key :true とすると、外部キー制約をつけられます。
【四日目】chatspaceグループ機能実装 render,redirect_to違い
今回つまづいたrender, redirect_toの違いについて。
render
controllerで処理した結果の出力先viewを指定する。
→表示させるview指定
→ログインや入力形式に失敗した場合など ⇨ ただエラーを表示させるだけ
controller → view
redirect_to
指定したcontroller、actionに再度リクエストを送信。
→URL(HTTPメソッド)を指定
→データ更新/削除が必要な場合 ⇨ controllerの処理が必要
controller → URL → route → controller → view
基本的に、
データを追加、更新、削除を行う時は「redirect_to」
データの取得を行う時は「render」
今日はここまで。
【三日目】ChatSpaceグループ機能のルーティング設定、ビュー設定
グループ機能のルーティング設定
そもそも、「ルーティングとは?」
ブラウザから届いたリクエストに対して、コントローラで定義したアクションを結びつける機能です。
resourcesを使えば、一括で複数のHTTPメソッドを設定できるため、大変便利です。
1 |
$ Rails.application.routes.draw do |
上記の通り、groupsのルーティングを設定。
ここで考えないといけないのが、messageにはmessage先が存在しています。
今回の場合だと、message先のグループがなければ、どのgroupに対してのmessageなのかわからなくなります。
messageを投稿する際、どのgroupへのmessageなのかパスから判断するようにしたいので、ネストという方法を使います。
?ネストとは?
入れ子構造とも呼ばれ、ある記述の中に入れ子構造で別の記述をする方法です。
ルーティングだと、あるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述することを指します。
赤字部分がネストになっております。
collection_check_boxes
1 |
$ = form_for @group do |f| |
:user_idsは更新対象のオブジェクト、つまり@groupが持つメソッド。チェックボックスの各チェックにIDが関連付けられます。createアクションを実行する時には、ストロングパラメータの設定が必要です。
:idは表示させるそれぞれのvalueの内容を表し、:nameは表示させるtextを示します。
続いて、ストロングパラメータを編集していきます。いまのままだとparamsのpermitはfalseとなるので以下をコントローラに記述します。
1
$ private
def group_params
params.require(:group).permit(:name, { :user_ids => [] })
errors_full_message
Railsのモデルにおいて、バリデーションエラーが発生した場合、errors.full_messagesメソッドを利用することで、発生した全てのエラーメッセージを配列で取得することができます。
@group.errors.full_messagesの配列に対し、eachメソッドを用いることで、エラーメッセージを1つずつ取り出しています。
1 |
$ .chat-group-form__errors |
今日はここまで。
【二日目】chatspace グループ機能作成、編集
現在実装しているchatアプリ グループ機能作成方法 備忘録
グループのコントローラ、モデル作成
まずは、以下の通り、groupsコントローラ作成
ターミナル
1 |
$ rails g controller groups |
Groupモデル作成
1 |
$ rails g model group
|
そして 、このままUserモデルとGroupモデルのマイグレーションファイル編集と、アソシエーション定義かと思いますが、実はここで注意点がある。
中間テーブルの作成が必要!!!
group_userモデル作成
1 |
$ rails g model group_user
|
?なぜgroup_userモデルを作成するのか?
このままだと、userモデルとgroupモデルが多対多の関係になるからだ。
多対多の関係は2つのモデルでは実現できないため、中間テーブルを利用して、多対多の関係を実現するわけです。
アソシエーションの定義
中間モデルを作成した場合、 throught: :中間モデル名として、アソシエーションを定義。
1 2 3 4 5 |
class Group < ApplicationRecord
has_many :group_users
has_many :users, through: :group_users
validates :name, presence: true
end
|
1 2 3 4 |
class GroupUser < ApplicationRecord
belongs_to :group
belongs_to :user
end
|
group_userモデルのマイグレーションファイルの編集。
1 2 3 4 5 6 7 8 9 |
class CreateGroupUsers < ActiveRecord::Migration[5.0]
def change
create_table :group_users do |t|
t.references :group, foreign_key: true
t.references :user, foreign_key: true
t.timestamps
end
end
end
|
Railsでは、マイグレーションファイルで外部キーとなるカラムを追加するときにforeign_key: trueと記述することで外部キー制約を設定することができます。
今日はここまで。