zumi-n 未経験からエンジニア転身日記

29歳、文系、未経験、営業がエンジニア目指してるzumi-nのプログラミングに関する諸々発信ブログ

【六日目】ChatSpace テストコード

RSpecを使ったテストについて学んだことの忘備録。

 

1.まずは、テストで使うGem導入

RSpec利用のため、'rspec-rails'

・コントローラのテストのため、'rails-controller-testing'

・ダミーインスタンス作成のため、'factory_bot_rails'

・ダミーデータ作成のため、'faker'

をGemfileに追加。

忘れずに、bundle installでインストール。

Gemfile
1
2
3
4
5
6
7
8
group :development, :test do
  gem 'rspec-rails', '~> 3.5'
  gem 'rails-controller-testing'
  gem 'factory_bot_rails'
  gem 'faker'
end

 

2.導入したrspecをインストール。

ターミナル
1
rails g rspec:install

 出力を見やすくするため追加。

1
--format documentation

 これでテストの準備完了。

 

3.FactoryBot使用

まずは、FactroyBotの記述を省略するためのコード。

/spec/rails_helper.rb
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
= render partial: 'message', collection: @messages
#_message.html.haml内で、messageという変数名を利用して出力されるインスタンスを利用できる

= render partial: 'message', locals: {tweet: "hello}
#_message.html.haml内でhelloという文字列が代入されたtweetという変数が利用できる

 

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

 

マイグレーションファイルで、カラム設定。

201XXXXXXXXXXX_create_messages.rb
 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メソッドを設定できるため、大変便利です。

 

$ Rails.application.routes.draw do
root 'messages#index'
devise_for :users
resources :users, only: [:edit, :update]
resources :groups, only: [:new, :create, :edit, :update] do
resources :messages, only: [:index, :create]
end
end

 

上記の通り、groupsのルーティングを設定。

ここで考えないといけないのが、messageにはmessage先が存在しています。

今回の場合だと、message先のグループがなければ、どのgroupに対してのmessageなのかわからなくなります。

messageを投稿する際、どのgroupへのmessageなのかパスから判断するようにしたいので、ネストという方法を使います。

?ネストとは?

入れ子構造とも呼ばれ、ある記述の中に入れ子構造で別の記述をする方法です。

ルーティングだと、あるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述することを指します。

赤字部分がネストになっております。

 

collection_check_boxes

$ = form_for @group do |f| 
〜省略〜
= f.collection_check_boxes :user_ids, User.all, :id, :name

:user_idsは更新対象のオブジェクト、つまり@groupが持つメソッド。チェックボックスの各チェックにIDが関連付けられます。createアクションを実行する時には、ストロングパラメータの設定が必要です。

:idは表示させるそれぞれのvalueの内容を表し、:nameは表示させるtextを示します。

続いて、ストロングパラメータを編集していきます。いまのままだとparamsのpermitはfalseとなるので以下をコントローラに記述します。

 

$  private
def group_params
params.require(:group).permit(:name, { :user_ids => [] })

 

 

errors_full_message

Railsのモデルにおいて、バリデーションエラーが発生した場合、errors.full_messagesメソッドを利用することで、発生した全てのエラーメッセージを配列で取得することができます。

@group.errors.full_messagesの配列に対し、eachメソッドを用いることで、エラーメッセージを1つずつ取り出しています。

$ .chat-group-form__errors
%h2= "#{@group.errors.full_messages.count}件のエラーが発生しました。"
%ul
- @group.errors.full_messages.each do |message|
%li= message

 

今日はここまで。

 

【二日目】chatspace グループ機能作成、編集

現在実装しているchatアプリ グループ機能作成方法 備忘録

 

グループのコントローラ、モデル作成

 

まずは、以下の通り、groupsコントローラ作成 

ターミナル

$ 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と記述することで外部キー制約を設定することができます。

 

今日はここまで。

 

ブログ開設

はじめまして。本日、ブログはじめました。

現在29歳、都内のメーカーで営業として働くzumi-nです。

 

実は、、、3月末で退職して、エンジニアを目指します!!!!!!

現在、渋谷にあるスクールに今年の1月から通っていますが、仕事終わりの数時間だけの勉強だと、非効率・半年間この生活を続けるのは職場的に難しいため、このような決意をしました!

 

今後は、スクールで学んだプログラミングの話を書いていきたいと思います。

 最初は、アウトプット用なので、役に立つかは、、、ですが、継続して発信していきます。