〜Ruby on Rails5 〜 新要素

〜ChatAppのDB設計をしよう〜

中間テーブル

 2つのテーブルの中間にあるテーブルのこと。多対多の関係にある2つのテーブルの間に挟まって、2つの組み合わせパターンだけをレコードとして保存する。2つのモデルだけでは多対多のアソシエーションを組むことができるないので、中間テーブルを利用して関係を定義する。

through(スルー)オプション

 モデルに多対多の関連付けを定義するときに使用する「has_many」メソッドのオプション。

 【例】models/photo.rb(photoテーブル)

 class photo < ApplicationRecord
has_many :photos_tags
has_many :tags, thuough: :photos_tags
end

 【例】models/tag.rb(tagテーブル)

 class tag < ApplicationRecord
has_many :photos_tags
has_many :photo, thuough: :photos_tags
end

 【例】models/photos_tag.rb(photoとtagの中間テーブル)

 class PhotosTag < ApplicationRecord 
belongs_to :photo
belongs_to :tag
end

 

〜ChatAppの基礎を作ろう〜

README(リードミー

 ソフトウェアの仕様、規格、インストール方法などを文書化したアプリケーションの説明書のようなファイル。特徴として、rails newを実行した際に自動生成され、マークダウンと呼ばれる記述方法で記載する。

マークダウン

 文書を記述するための軽量マークアップ言語のひとつ。マークダウンで記述されたものは、HTMLに変換される。マークダウンファイルの拡張子は、「.md」となる。

 

〜ChatAppのフロント実装をしよう〜

box-sizingプロパティ

 要素のボックスサイズをどのように算出するか指定できるCSSプロパティ。このプロパティの値に「border-box」を指定すると、要素のボックスサイズにpaddingとborderを含めるようになる。 

overflowプロパティ

 ボックスの範囲内に内容が収まらない場合に、はみ出した部分の表示の仕方を指定する際に使用する。

⑴scroll 

 収まらない部分はボックスからはみ出さない。内容が収まらない場合には、スクロールバーなどが表示される。 

label要素

 フォームの中でフォームの項目名とフォームの入力要素(画像選択フォーム、プルダウン、チェックボックスなど)を関連付けるための要素。

 

〜ChatAppのユーザー管理機能を実装しよう〜

authenticate(オーセンティケイト)_user!メソッド

 ログイン状態によって表示するページを切り替えるdeviseのメソッド。処理で呼ばれあた段階で、ユーザーがログインしてなければそのユーザーをログイン画面に遷移させることができる。

〜RSpec〜

〜テストを知ろう〜

テストコード

 アプリケーション内に記述する、そのアプリケーションの挙動を確認するためのコード。手動は確認項目を1つずつ手動で確認する必要があるが、テストコードはコマンド1つで全部チェックすることができる。

RSpec(アールスペック)

 Ruby on Railsのテストコードを書くために用いられるGem

正常系

 『ユーザーが開発者の意図する操作を行った時の挙動』を確認するテストコード。

異常系

 『ユーザーが開発者の意図しない操作を行った時の挙動』を確認するテストコード。

 例えば、必須項目を入力せずに送信した際は、『必須項目を入力してください』とアラート画面などがでることがある。この挙動を確認することは異常系に分類される。

単体テストコード

 モデルやコントローラーなどの機能ごとに問題がないか確かめること。例えば、PicTweetにおけるTweetモデルのテストコードでは『画像URLとテキストがない投稿は、テーブルに保存させない。』というバリデーションの挙動を確認する。

結合テストコード

 ユーザーがブラウザで操作する一連の流れを再現して、問題がないか確かめること。例えば、PicTweetにおけるツイート投稿のテストコードでは『画像URLとテキストを投稿して送信ボタンを押すと、投稿完了ページに移動し、TOPページに戻るとさきほど投稿した内容が表示されている』という流れを一気に確かめる。

 

RSpecの導入と単体テストコードを書く練習をしよう〜

テストコードの構造

【例】テストコード

RSpec.describe '簡単なテストコード' do
  describe '数字の計算' do
    it "1 + 1は2である" do
      expect(1 + 1).to eq 2
    end
  end
  describe '文字列の結合' do
    it "「カレー」と「ライス」をつなげるとカレーライスになること" do
      expect("カレー" + "ライス").to eq "カレーライス"
    end
  end
end
⑴ describe(ディスクライブ)

 日本語で、『〇〇について記述する』という意味を持つ。どのようなテストコードを書いているのかを説明するために記述する。do~endの間に記述し、入れ子構造をとることができる。

⑵ it

 『どのような結果になることを試しているのか』を記述する。 do~endの間に記述し、入れ子構造はとらない。

 example

 上記のitに記述した内容の総称のこと。

⑶ expect(X).to eq Y(エクスセプト)

 テストコードにおいて実際にコードなどを検証している部分のこと。『Xの結果はYになる』ということを確認している。このeqのように結果を判断するものを、マッチャと呼ぶ。

 マッチャ

 expectの中の記述と、結果とのつながりを表現するもの。

bundle exec(エグゼク)コマンド

 Gemの多くは、その他のGemと依存関係になっており、それらの依存関係を整理してくれるコマンド。このコマンドを使わないとエラーになることがある。

rspecコマンド

 specディレクトリ以下に書かれたRSpecのテストコードを実行するコマンド。

rails_helper

 RailsにおいてRSpecを利用する際に、共通の設定を書いておくファイル。各テスト用ファイルでこちらのファイルを読み込むことで、共通の設定やメソッドを適用する。

valid?(バリドゥ)メソッド

 日本語で「正しい」を意味し、valid?とすることで「正しいかどうか」を判定するメソッドとなる。作成したデータが正しく保存される場合は「true」を、保存されない場合はfalseを返します。また、保存されない場合は、「なぜ保存されないのか」のエラ〜メッセージも生成する。

errorsメソッド

 valid?にて判定されたデータのエラーを表示するメソッド。エラーメソッドを書くためには、続けて「full_messages」メソッドを使用する。

full_messagesメソッド

 生成されたエラーの中から、エラーメッセージを出力するためのメソッド。

include(インクルード)マッチャ

 日本語で「含む」を意味する。「expect(X).to include(Y)」の様に使用し、「Xの中にYという文字列が含まれているかどうか」を確認することができる。

  

〜効率的にテストコードを書こう〜

FactoryBot

 インスタンスをまとめることができるGem。他のファイルであらかじめ各クラスのインスタンスに定める値を設定しておき、各テストコードで使用する。

build(ビルド)

ActiveRecordのnewメソッドと同様の意味を持つ。

【例】 

 # FactoryBotを利用しない場合
user = User.new(nickname: "abe", email: "kkk@gmail.com",~)
# FactoryBotを利用する場合
user = FactoryBot.build(:user) 

before

 テストコードの同じ意図のコードをまとめることができるもの。

 require 'rails_helper'
RSpec.describe User, type: :model do
before do
# 何かしらの処理
  end

describe 'X' do
it "Y" do
# before内の処理が完了してから実行される
end
it "Z" do
# before内の処理が完了してから実行される
end
end
end

Faker(フェイカー)

 ランダムな値を生成するGem。メールアドレス、人名、パスワードなど、様々な意図に応じたランダムな値を生成してくれる。

〜PicTweetのモデルの単体テストコードを書こう〜

context(コンテキスト)

 正常系と異常系を分けるために使う記述

be_validマッチャ

 expectのインスタンスが正しく保存されることを判断する。『expect(インスタンス).to be_valid』のように使用する。

association :他のFactoryBot

 これは他のFactoryBotとアソシエーションがあることを意味している。インスタンスが生成さたと同時に、関連するFactoryBotのインスタンスも生成される。

 

〜PicTweetのコントローラーの単体テストコードを書こう〜

Request Spec

 RSpecが提供している、コントローラーのテストコードを書くために特化した手法。 

create

 テスト用のDBに値を保存するためのメソッド。ActiveRecordのcreateメソッドと同様の意味を持つ。注意点として、1回のテストが実行され、終了する毎にテスト用のDBの内容がロールバックされる。(保存された値が全て消去されてしまう。)

get

 「get 〇〇_path」のように、どこのパスにリクエストを送りたいかを記述する。「rails routes」コマンドで確かめることができる。

response

 リクエストの対するレスポンスそのものが含まれている。このレスポンスで取得できる情報に、想定する内容が含まれているかを確認することで、テストコードを書くことができる。

HTTPステータスコード

 HTTP通信において、どのような処理の結果となったのかを示すもの。

 ステータスコード      内容

   ⑴100~       処理の継続中

   ⑵200~       処理の成功

   ⑶300~       リダイレクト

   ⑷400~       クライアントのエラー

   ⑸500~       サーバーのエラー

 正常にレスポンスを得ることを確かめたい場合は、200というステータスコードを期待する。レスポンスの中からステータスコードを確かめるためには、「status」を利用する。

status

 「response.status」と実行するとこによって、そのレスポンスのステータスコードを出力できる。

body

 「response.body」と実行することによって、ブラウザに表示されるHTMLの情報を抜き出すことができる。

 

結合テストコードを書く練習をしよう〜

System Spec(システムスペック)

 結合テストコードを記述するための仕組みのこと。

Capybara(カピバラ

 System Specを記述するために必要なGem。

visit

 「viset 〇〇_path」のように記述すると、〇〇のページへ遷移することを表現できる。RequestSpecのgetと似ているが、getはあくまでリクエストを送るだけのことを意味し、visitはそのページへ実際に遷移することを意味する。

page

 現状のページを意味している。visitで訪れた先のページの見える文だけの情報が格納されている。後術するとおり、「ログアウト」などのカーソルを合わせてはじめて見ることができる文字列はpageの中に含まれない。

have_content

 「expect(page).to have_content('X')」と記述すると、visetで訪れたpageの中に、Xという文字列があるかどうかを判断するマッチャ。

fill_in

 「fill_in 'ファームの名前', with; '入力する文字列'」のように記述することで、ファームへの入力を行うことができる。フォームの名前を知るためには、検証ツールというものを使うことで知ることができる。

検証ツール

 ブラウザに標準で備わっている、HTMLの要素や、適用されているCSSのコードを確認することができる機能。

find().click

 「find("クリックしたい要素").click」と記述することで、実際にクリックできる。

change

 「expect{ "何かしらの動作" }.to change {モデル名.count }.by(1)」と記述することによって、モデルのレコードの数がいくつ変動するのかを確認できる。

 changeマッチャでモデルのカウントをする場合のみ、expect()ではなく「expect{}」となる。

 何かしらの動作の部分が「送信ボタンをクリックした時」の場合は、「find('input[name="commit"]').click」が入る。

current_path

 現在いるページのパスを示すもの。「expect(current_path).to eq 期待するページのパス」と記述すれば、今いるページが期待するページであることが確認できる。

hover

 「find("ブラウザ上の要素").hover」とすることで、特定の要素にカーソルを合わせた時に動作を再現できる。

heve_no_content

 have_contentの逆で、文字列が存在しないことを確かめるマッチャ。

 

〜ツイートの結合テストコードを書こう〜

have_selectorマッチャ

 指定したセレクタが存在するかどうかを判断するマッチャ

heve_linkマッチャ

 「expect("要素").to have_link 'ボタンの文字列', href: "リンク先のパス"」と記述することで、要素の中に当てはまるリンクがあることを確認できるマッチャ。a要素に対して用いる。

heve_no_linkマッチャ

 当てはまるリンクがないことを確認できるマッチャ。

all

 「all("クラス名")」でpageに存在する同名のクラスを持つ要素をまとめて取得できる。そして「all("クラス名")[0]」のように添字を加えることで「◯番目の指定したクラス」を取得することができる

find_link().click

 a要素で表示されているリンクをクリックするために用いる。「find_link("リンクの文字列", href: "URL").click」といった形で使う。

 

結合テストコードをまとめよう〜

サポートモジュール

 RSpecに用意されている、メソッド等をまとめる機能。

 【読み込む手順】

 ⑴ rails_helper.rbのコメントアウトを外す

 ⑵ モジュールを設定する(config.include モジュール名)

〜GitとGitHub〜

〜なぜ開発にGitやGitHubを使うのか〜

Git

 ソースコードなどのファイルやフォルダの変更履歴を記録・追跡するためのバージョン管理システム

GitHub

 Gitの仕組みを利用し、簡単に複数人での開発をできるようにしてくれるWebサービス。また、世界中の人々が自分の作品(プログラムコードやデザインデータなど)を保存し、公開している。

 

GitHub Desktopを使ってみよう〜

リポジトリ

 Gitの管理下にあるファイルやディレクトリの変更履歴を保管しておく箱のようなもの。

⑴ローカルリポジトリ

 自分のPC上(ローカル環境)に置くリポジトリ。作成したリポジトリは自分のパソコンの中にあるため、ファイルやディレクトリを変更、修正した際は好きなタイミングでこれを記録できる。

⑵リモートリポジトリ

 外部サーバー上に置くリポジトリのこと。ローカルリポジトリの変更修正を同期して、反映させることで更新できる。

commit(コミット)

 ファイルやディレクトリの変更修正を、リポジトリに記録すること。commitの際は、『どのような変更修正なのか』をわかりやすくするためにメモ(コメットメッセージ)を添えること。

push(プッシュ)

 ローカルリポジトリでのコミットをリモートリポジトリに反映すること。

commit log

 今まで行ったcommitの履歴を確認すること。commit logによってアプリケーションの実装の過程を振り返ることができる。また、実装を戻す際も、どこのcommitの段階まで戻るべきかわかる。

インデックス

 変更修正が、一時的に保存される場所。インデックスに保存されている内容がcommit

の対象になる。

add(アド)

 追加するファイルや変更修正をインデックスに登録して、commitの対象にすること。

 

GitHubを用いた開発の流れを実戦しよう〜

ブランチ

 リポジトリで管理しているファイルやディレクトリの変更の流れ、すなわちcommitの連なりのこと。ブランチは分岐でき、本流を『masterブランチ』、分岐したブランチを『トピックブランチ』と呼ぶ。

プルリクエス

 ブランチでのコミット履歴を残すと共に、各コミットにおける変更修正にコメントをつけることができるGitHubの機能のこと。

コードレビュー

 複数人での開発において、コードの記述内容に問題がないか、他の開発メンバー等が確認をすること。またコードレビューを担当する人をレビュアーと呼ぶ。

LGTM

 Looks good to meの略で、『コードに問題はないと思うよ!』という意味。

merge(マージ)

 機能実装のために作成したブランチを、リモートリポジトリ上のmasterブランチに反映する作業のこと。統合すると意味を持つ。

pull(プル)

 リモートリポジトリの変更をローカルリポジトリに取り込む操作のこと。

clone(クローン)

 複数人でアプリケーションを開発する際は誰か1名がアプリケーションを作成し、他のメンバーはそのアプリケーションを共有してもらう必要がある。その時に役立つのが『clone』となる。

git cloneコマンド

 リモートリポジトリを自分のパソコンにダウンロードするコマンド。以下のようにリモートリポジトリのURLに.gitを加えた文字列を指定することで、ローカルリポジトリとして取り込むことができる。

 【例】ターミナル

% git clone (ダウンロードしたいリモートリポジトリのURL)

 

〜よくあるエラーを体験しよう〜

stash(スタッシュ)

 現在の作業を一時的に退避したい時や、退避した作業を元に戻したい時などに使用する。

コンフリクト

 あるファイルにおいてブランチごとに情報が異なり辻褄が合わない状態のこと。『競合』という意味を持つ。

revert(リベート)

 間違ってpushしたcommitを取り消すことができる。commitを削除するのではなく、『指定するcommitを取り出すためのcommit』を追加で行う。

 

〜サービス設計〜

〜アプリケーション開発の手順を学ぼう〜

企画

 どんなアプリ(機能)を作るか決める段階のこと。

 ⑴誰のどんな問題を解決したいのかを決める。

 ⑵解決方法を決める。

要件定義

 ユーザーがどのように機能を使用するのかを考え言語化する、障害が起こったときどうするかを決めるなどの詳細情報を整理すること。

設計

 エンジニアが実際にどのようにアプリや新機能を作っていくかの手順書や、必要な設計図を作る工程のこと。

 設計には基本設計と詳細設計という2つのヒューズがある。

デプロイ

 作ったアプリを外部のサーバーに移して、全世界からアクセスできるように設計すること。

保守/運用

 アプリ/機能がデプロイされたあとの段階のこと。動いているアプリに異常がないか定期的に確かめたり、想定通りにアプリ、機能が動かないなどトラブルが発生したときに対処すること。

 

〜サービスを企画し要点を洗い出そう〜

ペルソナ

 マーケティング用語で、『サービスを使用するユーザー』のこと。

ユーザーストーリー

 『ペルソナの課題に対して、そのような機能で解決していくのか』を明確にしたもの。

 

〜設計しよう〜

基本設計

 要件定義の内容を、開発に必要な内容へまとめること。(外部設計とも呼ばれる。)

詳細設計

 実際に書くべきコードを洗い出す作業。

画面遷移図

 どの画面でどんな操作をしたらどのページに移動するかを図で表記したもの。

DB設計

 開発で使用するDB(データベース)の表を設計すること。具体的に考える項目は、『テーブル』や『カラム』、『関連付け(アソシエーション)』など。

 設計手順としては、まず保存する項目を洗い出し、どのようなテーブルがあれば管理しやすいかを考慮しつつ、その中でテーブル同士の関連付けを考える。

エンティティ

 サービスで扱われるデータ自体のこと。

モデリング

 エンティティの分類や関連付けなどを行い、模型のように表すこと。具体的にいうと、エンティティ自体を見直し、さらにエンティティ同士の関係性を考え、図などに表記したりすること。

正規化

 データベースの構造を効率的でシンプルな形にすることです。

 ⑴非正規型   何もしていない状態。

 ⑵第一正規型  重複する値やカラムを分離する。

 ⑶第三正規型  情報が混在するエンティティを分離する。

制約

 データを扱う際に制限をかけること。制約はDBへ直接設定するので、後に変更すると非常に手間のかかる可能性がある。

 

⑴NOT NULL制約

 テーブルの造成地にNULL(空の値)が入らないように制限する制約。指定したカラムが、DBに空のままの状態で保存するのを防ぐ。

 t.型 :カラム名, null: false

 例えば、usersテーブルの『name』カラムにNOT NULL制約を設定すると、nameカラムが空のレコードだと保存できなくなる。その制約は、『t.string :name』に『null: false』と記述することで設定できる。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name, null: false
      t.timestamps null: false
    end
  end
end

 

⑵一意性制約

 テーブル内で重複するデータを禁止する制約。emailカラムに対して一意性制約を設定することで、同じemailのレコードは保存できなくなる。

 

⑶主キー制約

 そのデータが空になることがなく、かつ重複していないことを保証する制約。主キーに対して、NOT NULL制約と一意性制約を両方設定するのと同義になる。

 また、Railsでテーブルを作成する際、主キー制約はidカラムとして自動で生成される。

 

⑷外部キー制約

 外部キーの対応するデータが必ず存在しなくてはいけない制約。関連性のあるテーブル同士を結びつける場合に、対応する外部キーのカラム後に記述する。

 t.型 :カラム名, foreign_key: true

 

⑸チェック制約

 値が保存される際に条件を満たしているかチェックできる制約。

 

ER図

DBのテーブルなどを図で表記したもの。 

〜Ruby on Rails5 〜 devise(Gem)編

 

〜ユーザーを登録しよう〜

devise(Gem)

 ユーザー管理機能を簡単に実装できるGem

rails g devise:installコマンド

 追加したdeviseというGemの『設定関係に使用するファイル』を自動で生成するコマンド。

rails g deviseコマンド

 deviseによるユーザー機能の対象を指定することで、モデルとマイグレーションの生成やルーティングの設定などをまとめて処理する。

 ※テーブルはこのコマンドでは作成されないため、『rails db:migrate』コマンドで、マイグレーションを実行しテーブルを作成する必要がある。また、テーブル・カラム情報を変更しているため、ローカルサーバーを再起動する必要がある。

user_signed(サインド)_in?メソッド

 deviseを導入している時に使えるメソッドで、ログインしているかどうかの判定を行うことができる。ユーザーがログインしていればtrueを、ログアウト状態であればfalseを返してくれる。使用方法は『if user_signed_in?』とifの条件式に部分に記載することで使用できる。

 また、link_toで作成したリンクは、デフォルトでGETメソッドを使用しているため、DELETEメソッドを使用する際は、methodオプションで『:delete』を指定が必要。また、GETメソッドを使用する場合は、methodオプションを省略することができる。

リダイレクト

 『本来受け取ったパスとは別のパスへ転送する』機能のこと。アクションに処理を持たせて実行した上で、そのパスのビューを返すのではなく別の意図したパスにユーザーを転送させることができる。また転送するためには、未ログインユーザーを判別する必要があるため、『user_signed_in?』『unless』を用いる。

unless(アンレス)

 『if』と同様に、条件式の返り値で条件分岐して処理を実行するRubyの構文。『if』と『unless』の違いは、返り値が『true』の時にelseまで処理されるのが『if』で、返り値が『false』の時にelseまで処理されるのが『unless』です。Railsではリダイレクト処理に『redirect(リダイレクト)_to』メソッドを使う。

redirect(リダイレクト)_toメソッド

 Railsでリダイレクト処理を行う際に使用するメソッド。コントローラー等での処理が終わった後、アクションに対応するビューファイルを参照せずに、別ページへリダイレクトさせることができる。

redirect_to action: :リダイレクト先となるアクション名

except(エクセプト)オプション

 berore_actionで使用できるオプション。『除外する』という意味があり、この後に指定したアクションは、事前処理を実行されない。

rails g devise: viewsコマンド

ビューファイルを生成することができるコマンド。

 deviseを実装すると、自動でログインとサインアップ画面が生成されるが、ビューファイルとしては生成されない。そのためビューファイルを変更したい場合は、『rails g devise:views』コマンドを実行し、ビューファイルを生成する必要がある。

rails g migrationコマンド

 マイグレーションを生成するコマンド。すでに作成されたテーブルの内容を変更する際に使用する。このコマンドは、指定するファイルの名前によって、どのようなテーブル操作を行うかを自動で記述する。『rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型』と記述することで、テーブルにカラムを追加する際に必要なコードが記述された状態で、マイグレーションが生成される。Addの後の『カラム名』の部分は、厳密なカラム名を入力する必要はないが、ファイル名を見ただけ動作を理解できる名前にしておくのが適切。

スネークケースとキャメルケース

 それぞれ単語の区切り方を表したもの。スネークケースは、単語の区切りを『アンダースコア』で表し、キャメルケースは、単語の区切りを『大文字』で表す。

 使い分け方(Railsの慣習的な命名規則

 ⑴クラス名       →アッパーキャメルケース(先頭から大文字)

 ⑵メソッド名・変数名  →スネークケース

mexlength(マックスレングス)オプション

 text_field(ヘルパーメソッド)につけることができるオプションで入力できる最大文字数を指定することができる。

 【例】maxlengthオプション

<div class="field">
  <%= f.text_field :nickname, autofocus: true, maxlength: "6" %>
</div>

devise_parameter_sanitizer(サニタイザー)メソッド

 deviseにおけるparamsのようなメソッド。diviseのUserモデルに関わる『ログイン』『新規登録』などをリクエストからパラメーターを取得できる。

 また、permitメソッドと組み合わせることで、diviseに定義されているストロングパラメーターに対し、自分で新しく追加したカラムも指定して含めることができる。

private
def configure_permitted_parameters #メソッド名は慣習
 # deviseのUserモデルにパラメーターを許可
 devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])

また、deviseに定義されているpermitメソッドと、Railsで初めから使用できたpermitメソッドとは異なるものである。

# paramsのpermitメソッド
params.require(:モデル名).permit(:許可するキー)

# devise_parameter_sanitizerのpermitメソッド
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])

 第一引数の処理名には、deviseですでに設定されている『:sign_in』『:sign_up』『:account_update』が使用でき、それぞれサインイン時やサインアップ時、アカウント情報更新時の処理に対応している。

 

 処理名の種類

 ⑴:sign_in       → サインイン(ログイン)の処理を行う時

 ⑵:sign_up      → サインアップ(新規登録)の処理を行う時

 ⑶:account_update  → アカウント情報更新の処理を行う時

application_controller.rbファイル

  全てのコントローラーが継承しているファイル。deviseにストロングパラメーターを追加するコードは、deviseのコントローラーが編集できないため、『application_controller.rb』に記述する。

 

 

〜マイページを実装しよう〜

current_userメソッド

 Gemのdeviseを導入しているため、使用できるメソッド。現在ログインしているユーザーの情報を取得できる。

 現在、ビューから送られてくる情報が入ったparamsと、curret_userメソッドで取得したログイン中ユーザーのidを統合した上で、ツイートを保存させる必要がある。

merge(マージ)メソッド

 ハッシュを統合させる時に使用するRubyのメソッド。

 tweet = { name: "たなか", text: "test", image: "test.jpeg"}
uid = { user_id: "1"}
tweet.merge(uid)
#=> {:name=>"たなか", :text=>"test", :image=>test.jpeg, :user_id=>"1"}

アソシエーション

 モデルを利用したテーブル同士の関連付けのこと。アソシエーションをモデルに定義することで、そのモデルに紐づく別のモデルの情報へアクセスできるようになる。

has_manyメソッド

 Userモデルの視点で考えると、あるユーザーの作成した投稿は複数個ある状態。つまり、1人のユーザーは複数の投稿を所有している。この状態のことを『has_many』の関係と言い、今回の場合は、『 User has many Tweets』の状態であると言える。

 この関連付けをするため、userと他のモデルとの間に『1対多』の繋がりがあることを示すのが『has_many』メソッドです。

belongs_toメソッド

 1つの投稿は、1人のユーザーが投稿したもの。つまり1つの投稿を複数人が投稿できないため、投稿は必ず1人のユーザーに所属する。この状態のことを『belongs to』の関係といい、今回の場合は、『 Tweet belongs to User』の状態であると言える。

 Tweetモデルと他のモデル(User)との間に『1対1』の繋がりがあることを示すのが『belongs_to』メソッドです。

N+1問題

 アソシエーションを利用した場合に限り、データベースへのアクセス回数が多くなってしまう問題のこと。これはアプリケーションのパファーマンス低下につながる。

 通常、Tweet.allなどでデータを取得する際は、1度のアクセスで済むが、今回のように、ツイートが複数存在する一覧画面に、それぞれユーザー名を表示するケースだと、tweetsに関連するusersの情報の取得に、ツイート数と同じ回数のアクセスが必要になる。

 この問題を解決する方法として、『includes(インクルード)』メソッドを使用する。

includes(インクルード)メソッド

 引数に指定された関連モデルを1度のアクセスでまとめて取得できるメソッド。書き方は、『モデル名.includes(:紐づくモデル名)

テーブルから不要なカラムを削除する方法

 削除する場合は、『テーブルからカラムを削除するためのマイグレーションを作成』してカラムの削除を実行する。

 【例】カラムを削除するコマンド

 #マイグレーションを制作
% rails g migration Removeカラム名From削除元テーブル名 削除するカラム名:型

 

〜表示順を並び替えよう〜

orderメソッド

 モデルで使用できる『ActiveRecoud』メソッドの1つで、テーブルから取得してきた複数のレコード情報を持つインスタンスの、並び順を変更するメソッド。

 引数には、『"並び替えの基準となるカラム名 並び順"』のように『並び替えの基準となるカラム名』と『並び順』を半角スペースで繋げて指定する。

 インスタンス = モデル名.order("並び替えの基準となるカラム名 並び順")

 並び順にはそれぞれASC{アスク(昇順)}DESC{デスク(昇順)}の2種類がある。

 

〜複数ページで利用する表示の一部をまとめよう〜

部分テンプレート

 ビューファイルにおいて繰り返し使用するコードを切り出し、再利用する仕組みのこと。

_◯◯.html.erbファイル

 部分テンプレートとして切り出すときに作成するファイル。テンプレート自体のファイル名は、命名規則として『アンダースコア_』を先頭に記述する。

render(レンダ)メソッド

 部分テンプレートを呼び出す際に利用するメソッド。また呼び出す部分テンプレートは、『partial(パーシャル)』というオプションで指定する。

partial(パーシャル)オプション

 renderメソッドで使用できるオプション。partialというオプションをつけ、部分テンプレート名を指定することで、該当する部分テンプレートを表示できる。

locals(ローカルズ)オプション

 renderメソッドで使用できるオプション。localsというオプションをつけることで、部分テンプレート内でその変数を使えるようになる。

 <% render partial: "sample", locals: {post: "hello!"} %>

 

〜ツイートにコメントを投稿しよう〜

ルーティングのネスト

 ネストとは、ある記述の中に別の記述をして、親子関係を示す方法。ルーティングにおけるネストは、あるコントローラーのルーティングの中、別のコントローラーのルーティングを記述すること。

 ネストをさせる1番の理由は、アソシエーション先のレコードのidをparamsに追加してコントローラーに送るため

 

〜投稿検索機能を実装しよう〜

collection(コレクション)とmember(メンバー)

 ルーティングを設定する際に使用できる。生成させるルーティングのURLと実行されるコントローラーを任意にカスタムできる。

 【例】correctionで定義した場合

 Rails.application.routes.draw do
resources :tweets do
collection do
get 'search'
end
end
end 

 【例】collectionのルーティング

 prefix          Verb    URI
search_tweets GET /tweets/search(.:format)

 【例】memberで定義した場合

 Rails.application.routes.draw do
resources :tweets do
member do
get 'search'
end
end
end

 【例】memberのルーティング

 prefix          Verb     URI
search_tweet GET /tweets/:id/search(.:format)

  URLの指定先が、correctionは『:id』なし、memberが『:id』ありとなる。

whereメソッド

 モデルが使用できる、ActiveRecordメソッドの1つ。『モデル.where(条件)』のように、引数部分に条件を指定することでm、テーブル内の『条件に一致したレコードのインスタンス』を配列の形で取得できる。

 引数の条件には、『検索対象となるカラム』と必ず含めて、条件式を記述する。

 【例】whereメソッド

 モデル.where(’検索対象となるカラムを含めた条件式’)

  また、whereメソッドを連続して記述することによって、複数の条件に一致したレコードを取得することもできる。

 【例】

 # idが3未満のtweetsテーブルのインスタンスを配列で取得
 [1] pry(main)> Tweet.where('id < 3')
=> [#<Tweet id: 1, image:  〜省略>#<Tweet id: 2, image: ~省略>]
 # idが3未満かつuser_idが1のtweetsテーブルのインスタンスを配列で取得
 [2] pry(main)> Tweet.where('id < 3').where('user_id: 1')
=> [#<Tweet id: 1, image:  〜省略> 

LIKE句

 曖昧な文字列の検索をするときに使用するもので、whereメソッドと一緒に使う。

 ※テーブルとのやりとりに関するメソッドはモデルに置く

 

 曖昧文字列について

 文字列    意味

  %     任意の文字列(空白文字列含む)

  _     任意の1文字

 

 実行サンプル

 実行例            詳細

 where('title LIKE(?)', "a%")   aから始まるタイトル

 where('title LIKE(?)', "%b")   bで終わるタイトル

 where('title LIKE(?)', "%c%")   cが含まれるタイトル

 where('title LIKE(?)', "d_")     dで始まる2文字のタイトル

 where('title LIKE(?)', "_e")     eで終わる2文字のタイトル

 

Railsのエラーを解消しよう〜

デバッグ

 任意でない処理(バグ)を見つけること。Railsで行うデバッグ作業の1つに、『pry-rails』というGemの機能を利用する方法がある。

pry-rails

 Railsにおけるデバッグ用のGem。『binding.pry(バインディングプライ)』という機能を使えるようになり、『binding.pry』という記述をソースコードの中にすると、『binding.pry』が存在する箇所でRailsの処理を一時停止し、その状態でコンソールを起動できる。

 

 

 

 

〜Ruby on Rails5〜 7つのアクション編

〜運用環境について〜

detabase.yml

 Ralisアプリケーションのデータベースの設定ファイルのこと。このファイルを編集することで、データベースの設定を運用環境ごとに変更することができる。 

運用環境 

 システムをどこで使用するか定められている環境のこと。環境を使い分けることで効率的に作業を進めることができる。また、運用環境は3種類あり、目的によって使い分けることが大事になる。

 ⑴development

  アプリケーションを開発する際に使う環境 

 ⑵test

  アプリケーションの動作をテストする際に使う環境

 ⑶production

  アプリケーションを実際にリリースする際に使用する環境。 

RDB (リレーショナル・データベース)

 表形式でデータを管理するデータベース。行と列を持っていてデータベースにおいては、行を『レコード』、列を『カラム』という。

RDBMSRDB・マネジメント・システム 

 RDB(リレーショナル・データベース)を使用する際、それを管理するシステムのことをいう。※MySQLRDBMSの1つです。 

 

〜ライブラリ導入について〜

ライブラリ

 プログラミングにおける拡張機能のこと。他のプログラムと組み合わせて使用するために、複雑なプログラムを1つのセットにしたもの。複雑な機能実装でも、ライブラリをアプリへ読み込ませることにより、簡単に実装できるようになる。 

RubyGems

 Rubyのライブラリを管理するシステムのこと。Rubyでは、RubyGemsにアクセスしてGemを取得する、『gemコマンド』が利用可能です。 

Gem

 ライブラリのこと。

Gemfile

 アプリケーションで使用するGemの『名前』と『バージョン』の情報を記載し、管理するファイル。

 Gemfile.lock

 『bundle(バンドル) install』によってインストール済みとなったGemの情報を記録するファイル。

 pry-rails(Gem)

 railsのコンソールでメソッドなどを使えるようにできる機能を追加するGem。 

bundle updateコマンド

 Gemのバージョンを新しく指定し直した時に使うコマンド。

 

〜ツイートを保存しよう〜

CRUD

 データの取り扱いの基本処理のこと。『Create(生成)』『Read(読み取り)』『Update(更新)』『Delete(削除)』の頭文字を並べたもの。Railsでは、CRUD7つのアクションに分割して処理する。 

7つのアクション

 ⑴ index(一覧表示)

 ⑵ show(詳細表示)

 ⑶ new(生成)

 ⑷ create(保存)

 ⑸ edit(編集)

 ⑹ update(更新)

 ⑺ destroy(削除)

resourcesメソッド

 7つのアクションへのルーティングを自動生成するメソッド。resourceの引数に、『:tweets』というシンボルを指定すると『/tweets』のパスに対応するルーティングが生成させる。

 【例】resourcesメソッドの使用例

 Rails/application.routes.drow do
resources :tweets
end

onlyオプション

 resourceにオプションとしてonlyを加えると、指定したアクションのみルーティングを自動生成する。

 【例】resourcesメソッドの使用例

 Ralis.application.routes.drow do 
  resources :tweets, only: :index
end

rails g controllerコマンド

 指定したコントローラーを削除するコマンド。このコマンドで削除を実行すると、自動で作成された関連ファイルも同時に削除されるので便利。

 【例】ターミナル

 % rails d controller コントローラー名

レイアウトテンプレート

 アプリケーションのビューファイルの共通部分をまとめたもの。レイアウトテンプレートに、headの情報やヘッダー、フッターなどの全てのビューで共通となる部分を記述しておくことで、各テンプレートファイルは個別の見た目を記述するだけで良くなる。Railsの場合、『application.html.erb』というファイルがレイアウトテンプレートとなる。

application,html.erbファイル

 Railsのレイアウトテンプレートに該当するファイル。

yield(イールド)メソッド

 レイアウトテンプレートに、各テンプレートファイルを展開するためのメソッド。application.html.erb中のbody要素内に『<%= yield%>』の記述がある。この記述があることで、『body要素内に各ビューファイルの記述が集結される』という仕組みができている。

 読み込むCSSファイルを指定できるヘルパーメソッド。application.thml.erbのsthlesheet_link_tagの引数には、『application』と書かれているため、『app/assets/stylesheets/』ディレクトリ内のapplication.cssファイルを読み込むことを示している。

 <%= stylesheet_link_tag 'application, media: 'all', 'date-turbolinks-track': 'reload' %>

application.cssファイル

 Railsにはじめから用意されている、CSSファイルをまとめるためのファイル。マニフィストファイルとも呼ばれる。アプリケーション全体に適用するCSSを指定できる。

/* * This is a manifest file that'll be compiled into application.css, which will include all the files * listed below. * * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's * vendor/assets/stylesheets directory can be referenced here using a relative path. * * You're free to add application-wide styles to this file and they'll appear at the bottom of the * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS * files in this directory. Styles in this file should be added after the last require_* statement. * It is generally better to create a new file per style scope. * *= require_tree . *= require_self */

 注目するポイントは、『*= require_tree.』という記述。*=コメントアウトとは異なり、SprocketsというGemの特殊記法(ディレクティブ)のこと。

require_tree

 引数として与えられたディレクトリ以下のCSSファイルをアルファベット順にすべて読み込むという機能を持つ。引数に与えられた.(ドット)は、カレントディレクトリを表す。

ルートパスの設定

 『root to: 'コントローラー名#アクション名'』で設定できる。

 

〜ツイートを保存しよう〜

 アプリケーションのデータ保存は、newアクションcreateアクションを組み合わせて実装する。

form_with(ヘルパーメソッド)の記載方法(2種類)

【例】①オプションが『url』の場合

 <%= form_with url: "/posts", method: :post, local: true do |form|%> 
<%# ファームの内部 %>
<% end %>

【例】②オプションが『model』の場合

 <%= form_with (model: @tweet, local; true) do |form| %>
<%# ファームの内部%>
<% end %>

 ②のようにファームを記述することで、『url』で投稿先を指定したり、『method』でHTTPメソッドを指定したりする必要がなくなる。

ストロングパラメーター(保存方法の1つ)

 指定したキーを持つパラメーターのみを受け取るように制限するもの。定義する際には、requireメソッドと、permitメソッドを組み合わせて使用する。

 

 ⑴requireメソッド

  送信されたパラメーターの情報を持つparamsが、使用できるメソッド。パラメーターからどの情報を取得するか、選択する。ストロングパラメーターとして使用する場合は、主にモデル名を指定する。またモデル名以外のキーも指定できる

 【例】require

 params.require(:モデル名) #取得したい情報を指定する。

 『params[:モデル名]』としても同じ情報を取得できるが、requireメソッドを使うことで、意図しないパラメーターであった場合にエラーとして返すことができ、原因特定やユーザーにエラーを示すなどの対応ができる。

 ⑵permitメソッド

 paramsが使用できるメソッドで、取得したいキーを指定でき、指定したキーと値のセットのみを取得できる。

 params.require(:モデル名).permit(:キー名, :キー名) 
#取得したいキーを指定する。

プライベートメソッド

 クラス外から呼び出すことのできないメソッド。Rubyでは、『private』と記述した以下のコードプライデートメソッドとなる。

 メリット

 ⑴ Classの外部から呼ばれたら困るメソッドを隔離

 ⑵ 可読性

バリデーション

 データを登録する際に、一定の制約をかけること。バリデーションを設ける際は、モデルに『validates』メソッドを記述する。

 【例】

 ・空のデータが登録できないようにする。

 ・すでに登録されている文字列を登録できないようにする。

 ・文字数制限をかける。

validates

 バリデーションを設定する時に使用するメソッド。

 【例】モデルファイル

 validates :カラム名, バリデーションの種類

 バリデーションの種類に『presence: true』と記述することで、nameカラムが『空ではないか』というバリデーションを設けることができる。

 【例】モデルファイル

 validates :カラム名, presence: true

 

〜ツイートを削除しよう〜

 アプリケーションのデータ削除は、destroyアクションで実装する。

削除ボタン追加方法

 『link_to』メソッドを使用して、削除ボタンを追加する。削除するツイートを区別するために、削除ボタンのパスにはツイートのidをパラメーターとして持たせる。HTTPメソッドは、『DELETE』というメソッドを指定する。指定方法は、methodオプションにシンボルで『:delete』とする。

 

Prefix(プレフィックス

 ルーティングの『URI Pattern』に名前をつけて変数化したもの。これにより、『URI Pattern』の代わりに『Prefix』を用いてパスを表現できる。prefixの確認方法としては、ターミナルで『rails routes』コマンドを実行することで確認できる。

 ※『URI Pattern』とは、URLと同じようなもの。

 

Prefix(プレフィックス)を用いてパスを指定する方法

【出力結果】

                   Prefix Verb   URI Pattern                                                                              Controller#Action
                   tweets GET    /tweets(.:format)                                                                        tweets#index
                          POST   /tweets(.:format)                                                                        tweets#create
                new_tweet GET    /tweets/new(.:format)                                                                    tweets#new
                    tweet DELETE /tweets/:id(.:format)                                                                    

 

 ⑴ ターミナルで『rails routes』コマンドを実行し、『Prefix』を確認する。

 ⑵ 『Prefix』が『tweet』なので、『tweet_path』とパスを指定する。

 ⑶ 『Prefix』を用いる前が、『"/tweets/#{tweet.id}"』と記述してそれぞれのツイートのID(tweet.id)が入るようにしていた場合は、『tweet_path(tweet.id)』のようにPrefixの引数として渡すようにする。

 

〜ツイートを編集しよう〜

 アプリケーションの編集機能は、editアクションupdateアクションを組み合わせて実装する。

PARCH(HTTPメソッド)

 情報を送信する際に使用するメソッド。

 

〜ツイートの詳細を表示しよう〜

 アプリケーションの詳細表示機能は、showアクションで実装する。

berore_action

 コントローラで定義されたアクションが実行される前に、共通の処理を行うことができる。berore_actionの後ろに『処理させたいメソッド名』を記載することで、アクションが実行されるより前に処理をする。

 また、resourcesと同様にonlyオプションなどを使用することで、どのアクションの実行前に、処理を実行するか決めることできる。

 

【令和2年10月9日】 〜テックキャンプ5日目〜

〜クラスとインスタンスを使って実装しよう〜

インスタンスメソッド

 個別の情報を使用して動作するを定義する際に使うメソッド。

 【例】インスタンスメソッドの定義

class クラス名
  def メソッド名
    # 処理
  end
end

 【例】インスタンスメソッドの呼び出し

インスタンス.メソッド名(引数)

 

◯属性と属性値

 属 性:データの性質となる情報

 属性値:属性に当てはまる値

(例:人間 性別(属性)・男(属性値))

 

インスタンス変数

 属性を定義する際に使う変数。定義しておくことで、全てのインスタンスが同じ属性を持つようになる。

 【例】インスタンス変数の定義

class クラス名
  def メソッド名
    @変数名 =   # インスタンス変数
  end
end

 

◯クラスメソッド

 クラスで共通の情報を使った処理をする際に使うメソッド。

 【例】クラスメソッドの定義

class クラス名
  def self.メソッド名
    # 処理
  end
end

 【例】クラスメソッドの呼び出し

クラス名.メソッド名(引数)

  【例】newメソッド

# インスタンスを生成するためにクラスメソッドとして定義されている
user = User.new

 

◯initealize(イニシャライズ)メソッド

 インスタンスが生成された瞬間に、生成されたそのインスタンスが実行する処理を定義するインスタンスメソッド。

 

【例】initializeメソッドの定義と実行

class クラス名
  def initialize
    # インスタンス生成したときに実行される処理(以下は例)
    puts "クラス名のインスタンスが生成されました"
  end
end

インスタンス = クラス名.new  # initializeメソッドが呼ばれ文字が表示される

 

Webアプリケーション基礎

〜Webアプリケーションの概要を学ぼう

 

〜リクエスとレスポンスを学ぼう

◯HTTP通信

 Webアプリケーションは、インターネット上で情報やデータなどを送受信して利用しており、この送受信のことをHTTP通信と言います。

 

◯URL

 インターネットのサービスの場所のこと。このURLにアクセスすることで、当てはまるWebアプリケーションと通信を行うことができる。

 

また、送受信自体にも名前がついている。

◯リクエス

 データや情報を要求すること(送信)

◯レスポンス

 リクエストに対応するデータや情報を返却すること(受信)

 

〜クライアントサイド・サーバーサイドを学ぼう

◯クライアント

 Websアプリケーションなどのサービスを利用する側、つまり様々なWebsアプリケーションを使用している人のこと。

 

◯ クライアントサイド

 クライアントが利用する領域

 

◯サーバー

 画面のないPC。Webアプリケーションはサーバーの中に保存されており、インターネットを介して通信することで、サービスが利用できる。またサーバーは、

・リクエストを処理し、レスポンスを返却する役割『ウェブサーバー』、

・アプリケーションで使用するデータを管理する役割を持つ『データベースサーバー』

・Webサーバーを通して受け取ったりリクエストを処理し、HTMLなどをウェブサーバーへ返却する役割を持つアプリケーションサーバー』の3つに分けることができる。

 

◯サーバーサイド

 Webアプリケーションが存在する領域のこと。

 

〜サーバーを動かしてみよう

Sinatra

 最小の労力でRubyによるWebプリケーションを作成できる仕組み。

 

◯require(リクワイア)

 rubyファイルで、sinatraのような仕組み自体を読み込む際に使用する記述。『require '読み込む対象'』と記述することで使用することができる。

 

◯ルーティング

 リクエストに対応した行き先を定義する仕組み。

 

◯HTTPメソッド

 HTTP通信の中で、行いたい処理の種類をサーバーへ伝える部分のこと。HTTPメソッドは、Webアプリケーションで使用する処理の種類ごとに8つ用意されている。

メソッド 処理
GET 取得する
POST 送信する、作成する
PUT 更新する、作成する
DELETE 削除する

 

◯リクエスト処理方法

require 'sinatra'

get '/' do

end

 

◯ローカルホスト

 自分のPC

 

 Rubyの主要フレームワークを知ろう

フレームワーク

 必要となる作業やリソースを事前に仮定し、用意してある便利なもの。

 

Ruby  on Ralls

 シンプルに扱いやすさを求めることができるフレームワーク

 

Ruby on Rails

〜Webアプリケーションの雛形を作ろう

railsコマンド

 命令は、すべてrailsというコマンドから始まります。

【例】railsコマンド
1
2
# railsに続けて、コマンドを記述する
% rails コマンド名

 

rails newコマンド

 Railsで新規アプリケーションを作成する際に使用するコマンド。使用することで、雛形が自動で生成される。実行方法としては、『rails new アプリケーション名』とコマンドを実行する。

【例】新規Railsアプリケーションの作成
1
2
# Railsアプリケーションを作成
% rails new アプリケーション名

 また、雛形を作成する時は、2つの指定を行う必要がある。

 ①バージョンの設定 ②オプションの設定

【例】バージョン・オプションの追加
1
2
# オプションを付けてアプリケーションを作成
% rails _6.0.0_ new アプリケーション名 -オプション名

 

 ◯dオプション

 rails newコマンドにつけることができるオプション。作成するアプリが利用するベータベースの管理システムの種類を指定できる。

【例】
1
% rails new アプリケーション名 -d データベース管理システム名

 

◯ rails db:create(クリエイト)コマンド

 新しくデータベースを作成する時に使うコマンド。

 

◯ rails db:dropコマンド

 データベースを削除する場合に使うコマンド。

 

◯ Sequel Pro(シークエル・プロ)

 データベースの中身をわかりやすく視覚化して表示するアプリケーション。使うことで、GUIで操作することができる。

 

◯ rails  sコマンド

 アプリケーションを動かすためのサーバーが起動する。※起動されるサーバーは、開発者のPC上だけで動く(ローカルサーバー)。

 

〜リクエストに対応する処理を決めよう

◯トップページへのルーティングを設定しよう。

【例】config/routes.rb
1
2
3
Rails.application.routes.draw do
 [HTTPメソッド] '[URIパターン]', to: '[コントローラー名]#[アクション名]'
end

 

◯ rails routesコマンド

 そのアプリケーションで設定されているルーティングを確認できる。

【例】ターミナル
1
2
3
4
5
6
# 作成したアプリケーションのディレクトリか確認(アプリ名「sample_app」の場合)
% pwd
/Users/ユーザー名/projects/sample_app

# 設定されているルーティングを確認
% rails routes

 

rails gコマンド

 Railsアプリに追加で必要なファイルなどを生成するために使用するコマンド。

【例】Railsに必要なファイルを生成
1
2
# ファイルを生成する
% rails g ファイルの種類 生成するファイル名

 

rails g controllesコマンド

 コントローラーやそれに付随するファイルを一度に作成してくれるコマンド。

【例】
1
2
# コントローラーを作成
% rails g controller コントローラー名

 ※命名規則は、『複数形を使用する』こと。(例:本→books)

 

rails dコマンド

 rails gコマンドで生成したフィイル一式を全て削除するコマンド。

 

◯アクション

 コントローラー内における、処理のカテゴリーのこと。コントローラーにインスタンスメソッドとして定義する。

 

アクション名 index   → 覧表示ページを表示するリクエストに対応して動く

       new   → 新規投稿ページを表示するリクエストに対応して動く

       create  → データの投稿を行うリクエストに対応して動く

       show    → 個別詳細ページを表示するリクエストに対応して動く

       edit    → 投稿編集ページを表示するリクエストに対応して動く

       update    → データの編集を行うリクエストに対応して動く

       destroy      → データの削除を行うリクエストに対応して動く

     

〜レスポンスに使う見た目を作ろう

◯ERB

 テンプレートエンジンと呼ばれる仕組みを持ったものの1つ。

 テンプレートエンジンとは、雛形となるテンプレートと、そのテンプレートにデータとなる記述を埋め込むことで、最終的に別のファイルとして生成できる仕組み。

 Railsにおける ERBファイルは、『〇〇.html,erb』という名前で作成される。

 

Rubyコードの埋め込み

 <%= %>というタグでRubyのコードを囲むことで、そのコードの結果を埋め込むことができる。 また、表示させなくても良いRuby記法(if文、each文など)は=を抜くことで、表示されないようにできる。

 

〜データの保存場所と管理役を作ろう

◯テーブル

 データベース内に作成される、データの種類ごとの保存場所。目的別にテーブルが存在する。また、データベースでは、テーブルの管理はできないため、共通した処理や、データの結びつきを定義する役割を持つ『モデル』というものが必要になる。

 

◯レコードとカラム

 表形式のテーブルにおいて、行はレコード、列はカラムと表現する。

 

◯モデル

 MVCの役割の一つで、Railsの中でデータベースへのアクセスをはじめとする情報のやりとりに関する処理を担当している。

 

rails g modelコマンド

 モデルやそれに付随するファイルを一度に作成してくれるコマンド。

 ※モデルの命名規則は、単数形を使用する。

 【例】

  % rails g model モデル名

 

マイグレーション

 db/migrate(マイグレート)/ディレクトリに入っているファイル。テーブルの設計図・仕様書。どのようなテーブルにするのかをマイグレーションファイル内に記載することで決めれる。一度実行すると再度実行できない仕組みになっている。

 

◯カラムの型

 『t.』の後に続くのが、カラムの型、その右側にシンボルで記載されるものがカラム名

 

 カラムの型の種類

 ⑴integer(インテジャー)

 説明 数値 

 用途 金額、回数など

 ⑵string(ストリング)

 説明 文字(短文)

 用途 ユーザー名、メールアドレスなど

 ⑶text

 説明 文字(長文)

 用途 投稿文、説明文など

 ⑷boolean(ブーリアン

 説明 真か偽か

 用途 はい・いいえの選択、合格・不合格のフラグなど

 ⑸datetime

 説明 日付と時刻

 用途 作成日時、更新日時など

 

rails db:migrate(マイグレート)コマンド

 マイグレーションに記述した内容を、データベースに適用するためのコマンド。

 

rails db:rollbackコマンド

 マイグレーション実行による変更を差し戻すためのコマンド。テーブルを修正したい場合は、ロールバック → 修正 → マイグレート の順で行うことでできる。

 

rails db:migrate:status(ステータス)コマンド

 マイグレーションが実行済みであるかをファイルごとに調べるコマンド。状態を表すステータスとして、『up』と『down』がある。実行済みファイルは『up』と表示されて、適用されていないときは、『down』と表示される。修正や削除が可能。

 

掃除

 

〜データを保存しよう

◯コンソール

 ターミナルからアプリケーションの操作をする仕組み。

 

rails cコマンド

 コンソールを起動するコマンド。このコンソールで、Railsアプリの変数やクラスを使用できる。

 【例】

 % rails c

 

◯saveメソッド

 モデルで使用できるインスタンスメソッド。使用することで、そのモデルが対応するテーブルにレコードを保存することができる。

 【例】

 モデルのインスタンス.save

 

 【例】

 # モデルのインスタンスを生成

 model = Model.new

 

 # インスタンスにデータを追加

 model.text = "追加するデータ"

 

 # テーブルにレコードを保存

 model.save

 

〜保存したデータを取得して表示しよう

ActiveRecordメソッド

 モデルがテーブル操作に関して使用できるメソッドの総称。

 【ActeveRecordメソッドの種類(一例)】

 ⑴ all

 用途 テーブルの全てのデータを取得する。

 【例】

 モデル名.all

 

 ⑵ find

 用途 テーブルのレコード内、ある1つのデータを取得する。

 【例】

 モデル名.find(レコードのid)

 

 ⑶ new

 用途 クラスのインスタンス(レコード)を生成する。

 

 ⑷ save

  用途 クラスのインスタンス(レコード)を保存する。

 

 【例】

 Post.all

 # Postモデル(postsテーブル)の全てのデータを取得する。

 Post.find(2) 

 # Postモデル(postsテーブル)の2番目のデータを取得する。

 

〜フォームを追加しよう

◯ヘルパーメソッド

 主にビューでHTMLタグを出現させたりテキストを加工するために使用するメソッドの総称です。

 【ヘルパーメソッドの種類(一部)】

 

 ⑴ form_with

 使用用途 投稿ページなどにおけるフォームの実装。

 【HTMLのフォーム記述】

 <form action="/posts" method="post">

  <input type="text" name="content">

  <input type="submit" value="投稿する">

 </form>

 

 【ヘルパーメソッドを用いたファーム記述】

 <%= form_with url: "/posts", method: :post, local: true do |form| %>

  <%= form.text_field :content %>

  <%= form,submit '投稿する' %>

 <% end %>

 form_withは、doからendまでの間がファームの記述になる。form_withの引数の『ral:"/posts"』『method: :post』『local: tuun』という記述はオプションと呼ばれ、それぞれフォームがどのような動作を行うかを決める。

 【method: :post】

 送信するHTTPメソッドを指定する。

 【local: true】

 送信の方法が変わることを防ぐために記述しているもの。

 

 ⑵ link_to

 使用用途 リンクの実装。

 【例】

 <%= link_to 'リンクに表示する文字', "リンク先のURL"%>

 

〜フォームから送信されたデータを保存しよう

◯パラメーター

 リクエストに含まれてサーバーの外部から渡されるデータのこと。Ralisのコントローラーにたどり着くパラメーターは、『params』というハッシュのようなものに格納されて、届けられます。

 

◯parms(パラムス)

 送られてきたパラメーターをハッシュのような構造で格納したもの。

 

◯createメソッド

 モデルが使用できるActiveRecordメソッドのひとつ。保存のために、new→情報を記述→saveとしていたところが、createメソッドの因数を記述して実行するだけで保存できる。

 【例】

 モデル.create(カラム名: 値)