rails チュートリアル　メモ集

これは雑記です。


##1
１章


動的　
動的  【 ダイナミック 】  dynamic
動的とは、状態や構成が状況に応じて変化したり、状況に合わせて選択できたりする柔軟性を持っていること。対義語は「静的」「スタティック」（static）。

———————————————
Git


ブランチとは
ブランチとは、履歴の流れを分岐して記録していくためのものです。分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができます。

マージ … は、Git において分岐した履歴を戻して統合する手段です。 git merge コマンドは、 git branch を使用して作成された、独立した複数の開発ラインをひとつのブランチに統合するコマンドです。

git checkoutとは
Gitのチェックアウト(checkout)とは、一言で言うと「ブランチを切り替えたいとき」に使用するコマンドです。

-bとは
brunch　の省略形

-Aとは
多分ALLの省略系　git add -Aで現在のディレクトリにあるファイルがすべて追加されます。


--set-upstreamとは
このオプションをつけるとローカルリポジトリの現在のブランチの上流をorigin master に規定したことになります。
このオプションをつけると、次からは git push だけで上記のコマンドと同じことを実施できます。また、git pull だけでも git pull origin master と同じ意味になります。

-uとは
 --set-upstream の略
git push -u origin master とすると次回から git push だけで勝手に origin master で push してくれる。
詳しくはhttps://www-creators.com/archives/5204


———————————————

プロンプト（英：prompt）とは
コマンドプロンプトなんかの画面上に表示される「ここから入力しなさい」なマークのこと

lessコマンドとは？
　「less」は、テキストファイルを1画面ずつ表示するコマンドです。「less ファイル名」で実行する他、「コマンド | less」のように、別のコマンドの実行結果を1画面ずつ表示する場合にも使われます。

moreコマンドとは？
moreコマンドは自動的にプロンプトを表示する
moreは、テキストファイルを1画面ずつ表示するコマンドです。「more ファイル名」で実行する他、「コマンド | more」のように他のコマンドの実行結果を1画面ずつ表示する際によく使われます。
　また、moreコマンドにサブコマンドがあり、［Enter］キーで1行、［スペース］キーで1画面先に進み、ファイルの末尾まで表示されると終了します。ファイルを表示している途中でも［Q］キーまたは［q］キーで終了できます。


pgとは
PostgreSQLデータベース
##2
２章

cdとは
ディレクトリを移動するためのコマンド。「ディレクトリ」って何？っていう人は、補足ページを見てみてください。ちなみに、なんでcdコマンドっていう名前なのかと言うとchange directoryの頭文字から来てます。多分。
使用例
cd abc
現在のディレクトリに存在するabcディレクトリへ移動する。
cd abc/bbb
現在のディレクトリに存在するabcディレクトリの中のbbbディレクトリへ移動する。
cd ./abc
現在のディレクトリに存在するabcディレクトリへ移動する（.には「現在の」というような意味がある）。意味は、cd abcと全く変わらない。
cd ../
現在のディレクトリの一つ上のディレクトリへ移動する。
cd ../abc
一つ上のディレクトリに存在するabcディレクトリへ移動する。
cd ../abc/bbb
一つ上のディレクトリに存在するabcディレクトリの中のbbbディレクトリへ移動する。
cd ../../
現在のディレクトリの二つ上のディレクトリへ移動する。
cd ../../abc
二つ上のディレクトリに存在するabcディレクトリへ移動する。
cd ../../abc/bbb
二つ上のディレクトリに存在するabcディレクトリの中のbbbディレクトリへ移動する。
cd ../../../
現在のディレクトリの三つ上のディレクトリへ移動する。../を増やすことで更に上のディレクトリへ移動できる。
cd ../../../abc
三つ上のディレクトリに存在するabcディレクトリへ移動する。
cd ../../../abc/bbb
三つ上のディレクトリに存在するabcディレクトリの中のbbbディレクトリへ移動する。
cd ~
自身のホームディレクトリへ移動する。
cd
自身のホームディレクトリへ移動する。
cd /
ルートディレクトリへ移動する。
cd /home
ルートディレクトリの中のhomeディレクトリへ移動する。
cd /home/tarou
ルートディレクトリの中のhomeディレクトリの中のtarouディレクトリへ移動する。
現在の位置を起点として移動する方法（cd abcやcd ./abcなど）を相対パス移動と言い、ルートディレクトリを起点として移動する方法（cd /homeなど）を絶対パス移動と言う。


HTTPプロトコルとは?
①クライアントからWebサーバーに向けてリクエストメッセージを送る
②Webサーバーはその中に書いてある内容を解読し、その要求に従って動作する


REpresentational State Transfer（REST）とは
RESTは、インターネットそのものやWebアプリケーションなどの、分散・ネットワーク化されたシステムやアプリケーションを構築するためのアーキテクチャのスタイルの1つです。


アーキテクチャ  【 architecture 】 とは
建築における建築様式や工法、構造などを表す言葉だが、ITの分野では、コンピュータやソフトウェア、システム、あるいはそれらの構成要素などにおける、基本設計や共通仕様、設計思想などを指すことが多い。


静的ページとは、いつどこでアクセスしても毎回同じものが表示される、HTMLファイルで作成されたWebページのことです。ユーザーの要求に対して、Webサーバーが要求されたデータをそのままブラウザに送信し、表示します。静的ページは、そのWebページの制作者が更新をしない限り内容は一切変化しません。


リファクタリング (refactoring) とは、コンピュータプログラミングにおいて、プログラムの外部から見た動作を変えずにソースコードの内部構造を整理することである

————————————————————————————————————————————————————————————————
 Rails用語
————————————————————————————————————————————————————————————————
インスタンス変数とは
くわしく解説してるURL↓
https://techacademy.jp/magazine/19835


@で始まるインスタンス変数
@記号で始まる変数をRubyではインスタンス変数と呼び、Railsのコントローラ内で宣言したインスタンス変数はビューでも使えるようになります。
##3
３章


プレースホルダとは、
実際の内容を後から挿入するために、とりあえず仮に確保した場所のこと。 また、そのことを示す標識などのこと

「アサーション」（assertion: 主張、断言）

response:success」は、実際にはHTTPのステータスコード（ここでは200 OK）を表します

<%= yield %>
このコードは、各ページの内容をレイアウトに挿入するためのもの

csp_meta_tag
クロスサイトスクリプティング攻撃を緩和するコンテンツセキュリティポリシー（Content Security Policy: CSP）を実装する

csrf_meta_tags
クロスサイトリクエストフォージェリー（Cross-Site Request Forgery: CSRF）攻撃を緩和する


———————————————————————————————————————————————————————————
Rails 用語


provideメソッドとは

日本語に訳すと
「供給する」「与える」
￼

application.html.erbは各viewで共通している部分のHTMLを書くファイルです。
provideメソッドで定義したものはlayoutファイル内においてyieldメソッドで呼び出すことができます。
こうすることで重複せずにビューを少ないコードで書くことができます（リファクタリング）


————————————————————————————————————————————————————————————————
ほーんと思ったこと

・「<% ... %>」と書くと、中に書かれたコードを単に実行するだけで何も出力しません。「<%= ... %>」のように等号を追加すると、中のコードの実行結果がテンプレートのその部分に挿入されます。

##4
４章


プロンプト

動作をするよう促すもの。
プロンプトとは、利用者がコンピュータに文字で命令を打ち込んで操作するコマンドラインインターフェース（CLI：Command Line Interface）において、システムが入力を受け付けられる状態であることを示す短い文字や記号の並び


\n
改行するときに使う
ex/
>> print "foo\n"  # puts "foo" と等価
foo
=> nil

include
含める

to_sメソッド
ほぼあらゆるオブジェクトを文字列に変換する
ex
>> nil.to_s
=> ""

SafeBufferオブジェクト
文字列オブジェクトではないため、ビューの中で式展開を使うと多くのエスケープ処理が実行されてしまう、
provide オブジェクトなどが代表例


エスケープ処理
エスケープ処理とは、プログラミング言語やソフトウェアで文字列を扱う際に、特定の記号文字などに続けて記された文字（の並び）に、その文字本来の意味とは異なる特別な意味や機能を与えること。先頭の特殊な文字を「エスケープ文字」という。
ex/
エスケープ
* HTML上で特殊文字を表示するための処理
例えば、HTMLの場合
￼
このように買ってに変換してくれるのがエスケープです。


to_a
配列に変換
>> 0..9
=> 0..9
>> 0..9.to_a              # おっと、9に対してto_aを呼んでしまっていますね
NoMethodError: undefined method `to_a' for 9:Fixnum
>> (0..9).to_a            # 丸カッコを使い、範囲オブジェクトに対してto_aを呼びましょう
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


%w
配列を文字列に変換
>> a = %w[foo bar baz quux]         # %wを使って文字列の配列に変換
=> ["foo", "bar", "baz", "quux"]
>> a[0..2]
=> ["foo", "bar", "baz"]


ブロック
>> (1..5).each { |i| puts 2 * i }　←　ブロックと呼ぶ
2
4
6
8
10
=> 1..5

UPCASE, DOWNCASE

リテラル
リテラルとは、プログラムのソースコードにおいて使用される、数値や文字列を直接に記述した定数のことである。
ソースコードにべた書きした文字とか数字
ex/ name = "ピヨ太";       age = 18;
の
ピヨ太
18
が
リテラル

プロンプト
動作をするよう促すもの

eachメソッドは、iという1つのローカル変数を使ってブロックを操作できます。そして、範囲に含まれるそれぞれの値をこの変数に次々に代入してブロックを実行します。



mapメソッドは、渡されたブロックを配列や範囲オブジェクトの各要素に対して適用し、その結果を返します

```
>> 3.times { puts "Betelgeuse!" }   # 3.timesではブロックに変数を使っていない
"Betelgeuse!"
"Betelgeuse!"
"Betelgeuse!"
=> 3
>> (1..5).map { |i| i**2 }          # 「**」記法は冪乗 (べき乗)
=> [1, 4, 9, 16, 25]
>> %w[a b c]                        # %w で文字列の配列を作成
=> ["a", "b", "c"]
>> %w[a b c].map { |char| char.upcase }
=> ["A", "B", "C"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
```


%w
配列を作る。配列の要素はスペース区切りで指定する。
式の展開はされない。


def yeller

##5
５章

as:オプション
routes.rbファイルでasオプションをつけると、名前を指定することができる。
config/routes.rb
 get 'exit', to: 'sessions#destroy', as: :logout 
名前付きヘルパーとしてlogout_pathとlogout_urlが作成される。
logout_pathを呼び出すと/exitが返される。

assert_selectとは
アプリケーションのビューのテストを行う際に使うアサーションメソッド
書式
assert_select(セレクタ, [条件], [メッセージ])
使用例
assert_select 'title', "Sign Up page"
だったら、title要素の内容を検証する際に使う
※アサーションとは、ある条件が成立しているかどうかをチェックすることを言う


スタブ【テスト】（英：stub）とは
テスト用に用意した、まだ完成していない機能の代わりとなる部品
でありテスト対象から呼び出される部品の代わりとなるやつ
##6
６章

attr_accessor
http://bryankawa.hatenablog.com/entry/2017/01/28/150537
参照わかりやすい

インクリメンタル
次第に増加すること。 増加部分を積み上げていく方式を指す語として用いられることが多い。

コンフリクトとは
競合、衝突、対立、葛藤、緊張、紛争などの意味を持つ英単語。ITの分野では、複数の装置やプログラムなどが同じ資源を同時に利用しようとして競合状態になってしまうことを意味する場合が多い。「競合」「衝突」の訳語が当てられることが多い。
プログラミングなどで、複数のライブラリなどが同じ名前空間やクラス名、変数名などを定義していて、両者を同時に利用できない状態になってしまうことをコンフリクトという。


requireとは
読み込むこと

Array
配列


TDD (test driven development)
テスト駆動開発

valid?メソッド
バリデーションが実行された結果
エラーが無い場合trueを返し，エラーが発生した場合falseを返す
オブジェクトの有効性をテストする
*不確定要素なのでもう一度しらべる！


inspectメソッド
これは要求されたオブジェクトを表現する文字列を返します
nspectメソッドとは、オブジェクトや配列などをわかりやすく文字列で返してくれるメソッドです
>> puts (1..5).to_a            # 配列を文字列として出力
1
2
3
4
5
>> puts (1..5).to_a.inspect    # 配列のリテラルを出力
[1, 2, 3, 4, 5]
>> puts :name, :name.inspect
name
:name
>> puts "It worked!", "It worked!".inspect
It worked!
"It worked!"


dupメソッド
同じ属性を持つデータを複製するためのメソッドです。


ISP
インターネットサーヴィスプロバイダーの略


uniquenessヘルパー
このヘルパーは、オブジェクトが保存される直前に、属性の値が一意（unique）であり重複していないことを検証します。



一意性
一意性制約 （いちいせいせいやく、Unique Constraint）とは、データベースにおいてデータを追加、更新する際の制約の一つで、列あるいは列のグループに含まれるデータが、テーブル内のすべての行で一意（「他に同じデータがない」の意味）であることを要求する。


:case_sensitive
オプションを用いて、大文字小文字の違いを確認する制約をかけるかどうかも定義できます。デフォルトでは、このオプションはtrueになります。


formatヘルパー
このヘルパーは、withオプションで与えられた正規表現と属性の値がマッチするかどうかのテストによる検証を行います。
:withoutオプションを使うと、指定の属性にマッチしない正規表現を指定することもできます。
デフォルトのエラーメッセージは「is invalid」です。


modelクラスのself
modelクラスの中でメソッドを定義する際に、メソッド名の頭にself.を付けるとクラスメソッド
付けないとインスタンスメソッドになります!
article.rb

class Article < ActiveRecord::Base
  def hoge         #インスタンスメソッド
  end

  def self.hoge    #クラスメソッド
  end
end

詳しく解説してるURL
https://qiita.com/suzuki-koya/items/1553c405beeb73f83bbc


reloadメソッド
データベースの値に合わせて更新する


assert_equalメソッド
値が一致しているかどうか確認する


コールバック（callback）メソッド
ある特定の時点で呼び出されるメソッドです。


before_saveメソッド
ここではユーザーが保存する直前に実行されるメソッド

setupメソッド
各テストが走る直前に実行されます。


authenticate
証明する


authenticateメソッド
のメソッドは、引数に渡された文字列（パスワード）をハッシュ化した値と、データベース内にあるpassword_digestカラムの値を比較します。


!!
オブジェクトが対応する論理値オブジェクトに変換できる
例:
>> !!user.authenticate("foobar")
=> true



!!でそのオブジェクトが対応する論理値オブジェクトに変換できる






ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
復讐した方が良さそうな奴
active record
データベースレベルでインデックスを追加して一意性を強制する方法↓
既に存在するモデルに追加するためにするためにマイグレーションファイルを直接作らんくてはいけないため、migration ジェネレータ(railsコンソール)を使って直接追加する
add_index メソッドを使ってusersテーブルのemailからむにunique: trueオプションを追加することで強制できるようになる。
##7
７章


３つのデフォルト環境
Railsにはテスト環境 ( test )、開発環境 ( development )、そして本番環境 ( production ) の3つの環境がデフォルトで装備されています
 
ハッシュ
Rubyには、ルートクラスのObjectにhashメソッドがあって、連想配列（Hash）のキーとして使う場合に、ハッシュ値として利用されます。
Hashの作成
Hashは以下のように作成します。
連想配列名 = {キー名1 => バリュー1, キー名2 => バリュー2, キー名3 => バリュー3}
どういうことなのか、例を使ってみてみましょう。 Hashを作成し、要素を取得してみます。
menu = {"うどん" => "300円", "ラーメン" => "500円", "パスタ" => "800円"}
print menu["うどん"]
出力結果:
  300円
このように、Hashではインデックスが番号ではなく指定したキーとなっています。要素を取得する際も、キーを指定することでセットになっている値(バリュー)を取得します。
Hashは今回の例のようにキーとバリューを関連付けたいときに非常に有用です。
詳しく解説
→https://techplay.jp/column/569


attribute
属性

Yメソッド
データ構造をプリントしてくれる？
もう一度くわしくしらべる！！！



alt属性
画像の代わりとなるテキスト情報のことです。
万が一画像が表示されなかったときに代替手段(alternative)として表示させるための文言と定義され、「代替テキスト」とも呼ばれています。
（altテキストを追加しておくと、視覚障害のあるユーザーがスクリーンリーダーを使うときにも役に立ちます）。
alt属性を使った例↓
module UsersHelper

  # 引数で与えられたユーザーのGravatar画像を返す
  def gravatar_for(user)
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end


form_with
このメソッドはActive Recordのオブジェクトを取り込み、そのオブジェクトの属性を使ってフォームを構築します。



inspectメソッド
れは要求されたオブジェクトを表現する文字列を返します。


admin属性
の属性は、Webサイトの管理者であるかどうかを示します




オプション引数
↓例
オプション引数というのは、key自体も自由に渡せる引数のことを言う。
　オプション引数は定義時に**引数名という形で定義する。

def data **options
  options.each do |key, value|
    puts "#{key}は#{value}"
  end
end
 
data 年齢: "20歳", 性別: "男性"
 
=> 年齢は20歳
=> 性別は男性

　オプション引数は、可変長引数のように数に制限なく渡すことができる。
　キーワード引数と組み合わせて定義することもできる。



def data name:, address:, **options
  puts "#{name}は#{address}に住んでいます"
 
  options.each do |key, value|
    puts "#{key}は#{value}"
  end
end
 
data name: "太郎", address: "東京", 年齢: "20歳", 性別: "男性"
 
=> 太郎は東京に住んでいます
=> 年齢は20歳
=> 性別は男性


any?メソッド
empty?と逆の動作で、要素が1つでもある場合はtrue、ない場合はfalseを返します。


pluralizeヘルパー
pluralizeの最初の引数に整数が与えられると、それに基づいて2番目の引数の英単語を複数形に変更したものを返します。このメソッドの背後には強力なインフレクター（活用形生成）があり、不規則活用を含むさまざまな単語を複数形にすることができます。
例↓
>> helper.pluralize(1, "error")
=> "1 error"
>> helper.pluralize(5, "error")
=> "5 errors"

>> helper.pluralize(2, "woman")
=> "2 women"
>> helper.pluralize(3, "erratum")
=> "3 errata"

require関数とは
標準ライブラリや、gemでインストールしたライブラリ、自分で書いたコードからソースコードを読み込む関数です。これにより、ライブラリに定義されたクラスやメソッドが利用できるようになります。

permitメソッド
とは、paramsで取得したパラメーターに対し保存の許可処理を行うメソッドです。



assert(式 [, メッセージ])
式が真ならば成功

assert_equal(変数1, 変数2 [, メッセージ])
変数1と変数2が等しければ成功

assert_not_equal(変数1, 変数2 [, メッセージ])
変数1と変数2が等しくなければ成功

assert_difference(expressions, difference = 1, message = nil, 6block)
ブロック実行後にecpressionsの値がdifferenceの分だけ変わっていれば成功

assert_no_difference(exoressions, message = nil, &block)
ブロック実行前後でexpressionsの値が変わっていなければ成功

assert_template(expected, message = nil)
そのアクションで指定されたテンプレートが描写されているかをバリデーション










HTMLの内容
————————————————————————————————————————————————————————————————————————————————————————————

asideタグ
< asideアサイド>〜</aside >
aside要素は補足や脚注、用語の説明など、本筋とは別に触れておきたい内容、または本筋から分離して問題のない内容を含んだセクションを表します。広告もこれに含まれます。逆に、抜き取ってしまうと本筋の意味が通らなくなる内容はaside要素にするべきではありません。
詳しく解説↓
https://dekiru.net/article/12870/
##8
８章


assert_response (type [,msg])
指定されたHTTPステータスが返されたか。:success(200)、:redirect(300番台)、:missing(404)、:error(500番台)など

リソース
要素

セッション
アクセス解析においてセッションとはwebサイトにアクセスして行う一連の動作の行動を示す。

fixture
テストに必要なデータをtestデータベースに読み込んでおくことができる、作成できる。


Expires
有効期限


include
含める


invalid
無効


count: 0オプション
assert_selectに追加すると、渡したパターンに一致するリンクが０かどうかを確認するようになります。


sessionメソッド
Railsのsessionメソッドを使うと、あるページから別のページに移動するときの状態を保持できる。一時的な状態の保存にはcookiesも使える


digestメソッドについて
渡された文字列のハッシュ値を返す
↓例
def User.digest(string)
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                  BCrypt::Engine.cost
    BCrypt::Password.create(string, cost: cost)
  end

--------------
authenticateメソッドは復習必要！！！

##9
9章　
トークン
パスワードの平文と同じような秘密情報です。パスワードとトークンとの一般的な違いは、パスワードはユーザーが作成・管理する情報であるのに対し、トークンはコンピューターが作成・管理する情報である点です。

ソルト化
暗号を強化するために加えられる任意の短い文字列です。

ローカル変数
使える範囲が決まっている変数のこと


メソッドチェーン
例↓
cookies.permanent.signed[:user_id] = user.id

signedメソッド(デジタル署名と暗号化)

permanentメソッド(永続化）

三項演算子
↓詳しく解説
https://qiita.com/Kohei_Kishimoto0214/items/45fb06dbf480a93ec2c1


FILL_INとは
埋めてくださいということ


ネスト
ネストとは、あるものの中に、それと同じ形や種類の（一回り小さい）ものが入っている状態や構造のこと。 ITの分野では、コンピュータプログラムやデータ構造において、ある構造の内部に同じ構造が含まれている状態のことを指す。












ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
メモ
beforesave内のself.emailのselfは恐らくローカル変数で間違いないはず。

ここの単元はよく読んで理解する！！！


##10
0章

unless 
条件式が偽である場合にだけ処理を実行する


論理演算値
0章

unless 
条件式が偽である場合にだけ処理を実行する


論理演算値
![スクリーンショット 2021-03-31 203723.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916905/826b533b-25dc-cb43-6aee-c755879af2de.png)
￼


requestオブジェクト
request.original_urlでリクエスト先が取得できます

request.get?
getリクエストが送られた時だけ格納
例↓
# アクセスしようとしたURLを覚えておく
  def store_location
    session[:forwarding_url] = request.original_url if request.get?
  end


will_paginateメソッド
usersビューのコードの中から@usersオブジェクトを自動的に見つけ出し、それから他のページにアクセスするためのページネーションリンクを作成しています。
しかし、pagenateメソッドを使った結果が無いと動かない



requestオブジェクト
request.original_urlでリクエスト先が取得できます

request.get?
getリクエストが送られた時だけ格納
例↓
# アクセスしようとしたURLを覚えておく
  def store_location
    session[:forwarding_url] = request.original_url if request.get?
  end


will_paginateメソッド
usersビューのコードの中から@usersオブジェクトを自動的に見つけ出し、それから他のページにアクセスするためのページネーションリンクを作成しています。
しかし、pagenateメソッドを使った結果が無いと動かない

##11
1章


resource
[qiita参考↓
まずは、resourcesについてまとめたいと思います。
config/routes.rbにresources :hogesと1行を書くのみで複数のルーティングが定義されます。
config/routes.rb

resources :hoges

複数のルーティングとは以下の通りです。
ターミナル

$rake routes

    hoges GET /hoges(.:format)          hoges#index 
          POST /hoges(.:format)         hoges#create 
 new_hoge GET /hoges/new(.:format)      hoges#new 
edit_hoge GET /hoges/:id/edit(.:format) hoges#edit 
     hoge GET /hoges/:id(.:format)      hoges#show 
          PATCH /hoges/:id(.:format)    hoges#update 
          PUT /hoges/:id(.:format)      hoges#update 
          DELETE /hoges/:id(.:format)   hoges#destroy


HTTPメソッドのGET、POST、PUT（PATCH）、DELETEがそれぞれ、show、create、update、destoryというアクションに対応しています。
例えば、GET /hoges/:idというルールであればHogesの集合体に対して特定のidを絞り込んだ結果をGET(取得)するという動作を表しています。
また、POST /hoges(.:format)hoges#createにidがありませんが、idは自動採番されるため、不要とされています。
このような仕組みがRESTの考え方に一致したものとなっています。「RESTful」なアプリケーションを作成することが、効率的にRailsのアプリケーションを構築する方法となっています。


つまりここではresources :account_activations, only: [:edit]となっていてonly editとなっているためedit_hoge GET /hoges/:id/edit(.:format) hoges#edit のようなルートが追加されたことになる。


エスケープ
foo%40example.com
このとき、メールアドレスの「@」記号がURLでは「%40」となっている点に注目してください。これは「エスケープ」と呼ばれる手法で、通常URLでは扱えない文字を扱えるようにするために変換されています

sendメソッド
このメソッドは、渡されたオブジェクトに「メッセージを送る」ことによって、呼び出すメソッドを動的に決めることができます。例を見てみましょう。Railsコンソールを開き、Rubyのオブジェクトに対してsendメソッドを実行し、配列の長さを得るとします。
$ rails console
>> a = [1, 2, 3]
>> a.length
=> 3
>> a.send(:length)
=> 3
>> a.send("length")
=> 3

このときsendを通して渡したシンボル:lengthや文字列"length"は、いずれもlengthメソッドと同じ結果になりました。つまり、どちらもオブジェクトにlengthメソッドを渡しているため、等価なのです。


!user.activated?
このコードは、既に有効になっているユーザーを誤って再度有効化しないために必要です。正当であろうとなかろうと、有効化が行われるとユーザーはログイン状態になります。もしこのコードがなければ、攻撃者がユーザーの有効化リンクを後から盗みだしてクリックするだけで、本当のユーザーとしてログインできてしまいます


assert_equal 1, ActionMailer::Base.deliveries.size
上のコードは、配信されたメッセージがきっかり1つであるかどうかを確認します。配列deliveriesは変数なので、setupメソッドでこれを初期化しておかないと、並行して行われる他のテストでメールが配信されたときにエラーが発生してしまいます

assignメソッド
assignsメソッドを使うと対応するアクション内のインスタンス変数にアクセスできるようになります。例えば、Usersコントローラのcreateアクションでは@userというインスタンス変数が定義されていますが（リスト 11.23）、テストでassigns(:user)と書くとこのインスタンス変数にアクセスできるようになる


SMTP
Simple Mail Transfer Protocol（シンプル メール トランスファー プロトコル、SMTP）または簡易メール転送プロトコルは、インターネットで電子メールを転送するプロトコルである








分からないリスト

引数の一般化
？名前を変更するだけで可能？？

##12
１２章


パスワード更新
パスワード再設定の有効期限が切れていないか
無効なパスワードであれば失敗させる（失敗した理由も表示する）
新しいパスワードが空文字列になっていないか（ユーザー情報の編集ではOKだった）
新しいパスワードが正しければ、更新する

password_reset_expired?インスタンスメソッド
期限切れかどうかを確認する


最初に「forgot password」フォームを表示して無効なメールアドレスを送信し
次はそのフォームで有効なメールアドレスを送信します
後者ではパスワード再設定用トークンが作成され、再設定用メールが送信されます
続いて、メールのリンクを開いて無効な情報を送信し
次にそのリンクから有効な情報を送信して、
それぞれが期待どおりに動作することを確認します

assert_equal(exp, act, msg = nil)
exp == actが真の場合にアサーションが成功します。

assert_template (temp [,msg])
指定されたテンプレートが選択されたか

assert_select (selector [, equality [,msg]])
selectorに合致した要素の内容を引数equalityでチェック

assert_not
例えばassert_not  fooは、fooが真なら失敗、偽なら成功、assertならこの逆

assert_redirected_to ([opts [,msg]])
リダイレクト先 optsが正しいか

opts

toggle!(:flag)
その属性を反転し保存する

toggle(:flag)
その属性を反転する。レコードを保存するには save が必要


inputタグ
例↓
assert_select "input[name=email][type=hidden][value=?]", user.email
上のコードは、inputタグに正しい名前、type="hidden"、メールアドレスがあるかどうかを確認します。
<input id="email" name="email" type="hidden" value="michael@example.com" />

##13
１３章


belongs_to
モデル間を関連づけるために必要？
class Micropost < ApplicationRecord
  belongs_to :user
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 140 }
end

アンダーラインの意味はマイクロポストがユーザーに所属するという意味を持つ。
詳しく解説↓
https://www.sejuku.net/blog/26617


has_many
app/models/user.rb
class User < ApplicationRecord
  has_many :microposts
  .
  .
  .
end

でアンダーラインの意味はユーザーがマイクロポストを複数所有するという意味を持つ


user:references



複合キーインデックス（Multiple Key Index）
例↓
add_index :microposts, [:user_id, :created_at]


.valid?
存在性のバリデーションに対するテスト


default scope



->
ラムダ式、ブロックを引数に取り、Procオブジェクトを返します
procオブジェクト
callメソッドが呼ばれた時、ブロック内の処理を評価します。
上記２つの例↓
>> -> { puts "foo" }
=> #<Proc:0x007fab938d0108@(irb):1 (lambda)>
>> -> { puts "foo" }.call
foo
=> nil



user/micropost関連のメソッド
micropost.user
Micropostに紐付いたUserオブジェクトを返す
user.microposts
Userのマイクロポストの集合をかえす
user.microposts.create(arg)
userに紐付いたマイクロポストを作成する
user.microposts.create!(arg)
userに紐付いたマイクロポストを作成する（失敗時に例外を発生）
user.microposts.build(arg)
userに紐付いた新しいMicropostオブジェクトを返す
user.microposts.find_by(id: 1)
userに紐付いていて、idが1であるマイクロポストを検索する



dependent: :destroy
というオプションを使うと、ユーザーが削除されたときに、そのユーザーに紐付いた（そのユーザーが投稿した）マイクロポストも一緒に削除されるようになります


if @user.microposts.any?
ユーザーのマイクロポストが1つもない場合には空のリストを表示させていない

takeメソッド
限られた数？
例↓
User.order(:created_at).take(6)　
のとき、orderメソッドを経由することで、作成されたユーザーの最初の6人を明示的に呼び出すようにしています


response.body
そのページのHTML本文をすべて返すメソッド


Micropost.where("user_id = ?", id)
このコードの疑問符はセキュリティ上重要な役割を果たしている。
SQLクエリに代入する前にidをエスケープしてくれる


request.referrer
このメソッドはフレンドリーフォワーディングのrequest.url変数と似ていて、一つ前のURLを返します
でDELETEリクエストが発行されたページに戻すことができる

ログイン、
マイクロポストのページ分割の確認、
無効なマイクロポストを投稿、
有効なマイクロポストを投稿、
マイクロポストの削除、
そして他のユーザーのマイクロポストには［delete］リンクが表示されないことを確認



follow_redirect!
このメソッドは、POSTリクエストを送信した結果を見て、指定されたリダイレクト先に移動するメソッドです


has_one_attachedメソッド
これは、指定のモデルと、アップロードされたファイルを関連付けるのに使います。
imageを関連づけた例↓
app/models/micropost.rb
class Micropost < ApplicationRecord
  belongs_to       :user
  has_one_attached :image
  default_scope -> { order(created_at: :desc) }
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 140 }
end


file_fieldタグ
viewページに画像アップロードを追加するために必要なタグ。
ここでいうマイクロポストのフォームに必要。
例↓
<span class="image">
    <%= f.file_field :image %>


attachメソッド


variantメソッド
で変換済み画像を作成できるようになる
image.variant(resize_to_limit: [500, 500])
resize_to_limitオプションを使って画像の幅や高さに制限をかけた例

buildメソッド
buildめそっどはnewメソッドと違いはないがモデル関連づけの際はbuildメソッドを使う約束があるようです
##14
１４章（最終章）ユーザーをフォローする

ページ操作の全体的なフロー
あるユーザー（John Calvin）は自分のプロフィールページを最初に表示し（図 14.1）、
フォローするユーザーを選択するためにUsersページ（図 14.2）に移動します。
Calvinは2番目のユーザーThomas Hobbes（図 14.3）を表示し、［Follow］ボタンを押してフォローします。
これにより、［Follow］ボタンが［Unfollow］に変わり、
Hobbes の［followers］カウントが1人増えます（図 14.4）。CalvinがHomeページに戻ると、［following］カウントが1人増え、Hobbesのマイクロポストがステータスフィードに表示されるようになっていることがわかります


ユーザーをフォローする機能を実装する第一歩は、データモデルを構成すること
has_many through


フォロー、フォロー解除で作成、削除されるのは、「関係（リレーションシップ）」である。
twitterは非対称な関係性が成り立つ。
非対称な関係性を見分けるために、それぞれを能動的関係（Active Relationship）（自分だけフォローしてる場合）と受動的関係（Passive Relationship）（相手だけフォローしてる場合）と呼ぶ


indexとは
特定のカラムからデータを取得する際に、テーブルの中の特定のカラムのデータを複製し検索が行いやすいようにしたものです。
例えば、あるユーザーをバイネームで検索したい！となった際に、Usersテーブルのnameカラムにインデックスを張ってないと、プログラムは、Userテーブルのnameカラムを上から順にみて、そのユーザーのデータを取得します。もし、これが1万人もしくはそれ以上の大量のデータを含むカラムだったらどうでしょう。すごく時間がかかりますね。
Usersテーブルのnameカラムにindexを張ることで、アルファベット順にnameを並べ替え検索しやすいようにしてくれます。


add_index :relationships, [:follower_id, :followed_id], unique: true
↑複合キーインデックス
follower_idとfollowed_idの組み合わせが必ずユニークであることを保証する仕組みです。これにより、あるユーザーが同じユーザーを2回以上フォローすることを防ぎます。また、メールアドレスの一意性を保証する。


railsでは関連付けの推測をしている。
デフォルトでは外部キーの名前を<class>_idといったパターンとして理解し、 <class>に当たる部分からクラス名（正確には小文字に変換されたクラス名）を推測します。
例えばFooBar.underscoreならfoo_barに変換される。つまりFoobarオブジェクトの外部キーはfoo_bar_idになる。

valid?
実行すると、バリデーションがトリガされ、オブジェクトにエラーがない場合はtrueが返され、そうでない場合は、falseが返される

:sourceパラメータ
ここではfollowing配列の元はfollowed idの集合である」ということを明示的にRailsに伝えます。↓
↓斜め文字参照
リスト 14.8: Userモデルにfollowingの関連付けを追加する

app/models/user.rb
class User < ApplicationRecord
  has_many :microposts, dependent: :destroy
  has_many :active_relationships, class_name:  "Relationship",
                                  foreign_key: "follower_id",
                                  dependent:   :destroy
  has_many :following, through: :active_relationships, source: :followed
  .
  .
  .
end

<<演算子
配列の最後に要素を追加
↓例
>> a.push(6)                  # 6を配列に追加する
=> [42, 8, 17, 6]
>> a << 7                     # 7を配列に追加する
=> [42, 8, 17, 6, 7]
>> a << "foo" << "bar"        # 配列に連続して追加する
=> [42, 8, 17, 6, 7, "foo", "bar"]


memberメソッド
ユーザーidが含まれているURLを扱うようになりますが、idを指定せずにすべてのメンバーを表示するには、次のようにcollectionメソッドを使います。
resources :users do


||=
||= は変数に値がnilであれば、右辺の値（またはメソッド）を代入することができる
便利なやつ！

hidden_field_tagメソッド
このメソッドは、次のフォーム用HTMLを生成します。
例↓
app/views/users/_follow.html.erb
<%= form_with(model: current_user.active_relationships.build, local: true) do |f| %>
  <div><%= hidden_field_tag :followed_id, @user.id %></div>
  <%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>

↓

<input id="followed_id" name="followed_id" type="hidden" value="3" />


whereメソッド
whereメソッドとは、テーブル内の条件に一致したレコードを配列の形で取得することができるメソッドです。
使い方↓
モデル名.where("条件")



列挙可能オブジェクトである条件
eachメソッドを実行しているかしていないか



mapメソッド
map() メソッドは、与えられた関数を配列のすべての要素に対して呼び出し、その結果からなる新しい配列を生成します。





疑問
なぜrelasionshipとUserの関連付けを行うのか？