18卒超新人級エンジニアが改訂3版基礎Ruby on Railsを読んで

改訂3版基礎Ruby on Railsを読んでみる

# 現状：

当方が4月からエンジニアとしてIT企業に入社するにあたり課題としてrailsでサービスを作っている。

# 目的：

サービスを作るにあたって不明点があまりにも多すぎた。
入社に向けて知識量を増やしたい。
遅すぎるがサービスの向上のための学習。

# 課題感：

成長を見据え、知識不足を補うために定期的に専門書を読み、形として残す。
私自身の振り返りはもちろんのこと、私同様初めてプログラミングをやってみたという方々の共感材料になればと思う。

## 概要
ruby on rails tutorialでは得られなかった初見を中心にメモっていく

### Ruby on Railsの概要
- Rubyはクラス設計、オブジェクトの実装拡張ができる
- ルーティングはurlのパスとコントロールを結びつける役割
- 変数名を大文字から始めると定数になる
- Rubyの変数の種類:
ローカル変数、グローバル変数、インスタンス変数、クラス変数

- ソースコードに直接書かれた数値や文字列をリテラルという＝>オブジェクト
- `gets`はターミナルから入力された文字列を返すメソッド
`-chomp`は文字列の末尾から改行文字を取り除くメソッド
- `#{〇〇}`というのは〇〇を文字列に変換した結果がうめこまれる

### 条件分岐
- 条件文:
Case 変数
When 式1...
- おみくじとかもできる,`case`は`===`3つ
- if文は1行でかけるその場合は末尾に`then`を置く
後置の条件文という
- `elsif`の綴りミスに気を付ける
- if文はテンプレートにも使える


### メソッドって？？
- メソッドは機能の呼び出しのことを言う
- メソッドとはコードの塊に名前をつけたもの
- 引数はメソッドに指定する数値や文字列
- `Puts`,`print`メソッドはターミナルに表示するメソッド
→　デバッグで使うことができる
- メソッドは用意されたものだけでなく自分で作ったものも使える
- メソッドを抜ける場合は`return`を使えば抜けられる
- メソッドを呼び出すときにブロックといわれるコードの塊を渡すことができる
- 読み出しや書き込み用のメソッドをアクセサメソッドという
- レシーバとは`.`の左側
- ＝つきのメソッドを呼ぶときはレシーバが必要

### ブロックと繰り返し
- ブロックは`do`から`end`までのかたまり
- fileクラスのopenメソッドもブロックを呼び出せる
- ファイル内にそれを実行してくれる`yield`後に数値や文字列を指定するとそれがブロックパラメータの中身になる
- `begin~rescue~end`で例外処理ができる

### 例外処理
例外が発生する可能性のあるプログラム、のちに処理するプログラム、しなかった場合のプログラム
- メソッドの場合はbeginなしで`rescue`,`else`で例外処理ができる

### 配列と演算子
- rubyは数値と文字列は相互変換行われない
- `%w()`を使うと配列を簡潔にできる
- `inspect`メソッドは配列を読みやすい文字列に変換してくれる
`put arr.inspect == p arr`
- 演算子には優先順位がある
- 算子の直後に改行しても文は続いているとみなされる
`!=`...等しくないという比較演算子
`!()`...ではない
- 文字列を整数に変換数メゾッド：`to_i/(put= gets.to_i)`

### リンクの使い方
- リンクを用いたタグの生成
`link_to “会員一覧”, :members`
`link_to “home”, root_path, class:”menu”`

### rubyのオブジェクトあれこれ
- シンボルとは文字列を整数で表したもの
`"name"`が文字列`:name`がシンボル
- `detect`==`find`メソッド
- ハッシュ(連想配列)もオブジェクトの集まりを扱うオブジェクト、配列との違いは値に関する動作を番号の代わりにキー(名前)を使うこと
- `range1..10`範囲を示す
- `range1...10`最後の要素を含めない
- オブジェクト内のデータにアクセスするにはメソッドを書かなくてはならない
- nil,true,falesもオブジェクト

### rubyのクラス
- クラスに似たものをモジュールという
- クラスにモジュールを取り込むことをミックスインという

### railsのリクエスト、ルーティング
- HTTPはブラウザとサーバーがhtmlや画像などの情報をやり取りするときに使われるプロトコル
- getはリソースの要求
- postはリソースの送信
- ルーティングの設定に放ちパスをブラウザで開こうとするとエラーが起きる
- `no route matches`エラーの理由{
- ルーティングミス
- httpメソッドが合わない、postしか受け付けないアクションでgetしようとしたとき
- 存在しないファイルにアクセスしようとしたとき<br>
}
- `root` "コントローラー名#アクション名"でトップページを指定
- パラメータを,パスの中に埋め込みたいときは`:+パラメータ名`& コントローラーの中に`params[:id]`を入れる必要ある
- searchアクション（routes.rbをいかに変更）
`resources :book do
collection{get"search"}
end`

### 時間表示
- `ragexp`クラス
- timeクラスオブジェクトを使うにはクラスメゾットnowを使う
`time= Time.now`
`puts time.strftime("%y/%m/%d %h:%m")`
`strftime`メソッド

### ファイルの読み込み
- 別ファイルに書かれたプログラムをソース上に取り込むには`require`メソッドをる使う
- 基本ファイルであれば何でも取り込める
<br>

- active supportは時間の扱いを簡単にしてくれる
### インスタンスメソッド
- オブジェクトの設計をクラス、設計図に基づいて実際につくられたオブジェクトをインスタンスという
- インスタンスごとにデータを持たせるにはインスタンス変数を持たせる
- メソッドの呼び出しは制限がかけられ、どこからでも呼び出せるのはpablic、同じクラスやサブクラスのメソッド内だけで呼び出せるのがprivateメソッド

コントローラーの基本
- コントローラはモデルからデータを受け取りビューにレンダリングを行わせる
- 命名規約がある
- `application_comtroller`は全てに共通
`get “lesson/:action(/:name)”=>”lesson”`
- IPアドレスは取り出せる
- リダイレクションを行うとき同時にフラッシュが、よく使われる
- アクションコールバック
- アクションが実行される前後には、決まりきった処理を行うことがよくあり、アクションコールバックを行うとそうした処理を一つのメソッドにまとめて記述できる
・befor_action
・after_action
・around_action
の３つがある

### テンプレの基本
- railsはアクション用のテンプレや部分テンプレをレンダリングしたのちにレイアウトテンプレをレンダリングする
- applicaitioncontrollerにlayoutメソッドを記述するとすべてのコントローラ^にレイアウトが継承される
- 部分テンプレ用のファイルはファイル名の前に＿をつける
- renderメソッドを使って＿と拡張子を除いたもの""で囲う<br>
->ex)ファイル名shared/_sidebar.html.erb<br>
の場合<br>
```<%= render "sidebar"%>```
- 主キー（idカラム）

### Rake
- Rakeとは...ビルドツール、とは...指定した一連の手順にしたがってファイルの依存関係を調べ自動的にコマンドを実行するソフトウェア

### テーブルのあれこれ
- テーブルのカラム＝モデルの属性
- モデルは単数形
- マイグレーションによって自動的にテーブル内のカラムを定義
- `null: fales`によって空の値は保存されない
- dbを古いバージョンに戻すことは可能
- インデックスをカラムに加えるとによって索引機能が高速化するがメモリは食う`add_index`で追加可能
- 実用化を目指すサービスにするのであれば必ず必要になる
- サイトを公開する前にあらかじめdbに初期化用のデータのことをシードデータという

### レコードの作成と更新の流れ
newアクションで作成、ビューでレンダリング、クリエイトアクションにフォームの送信
エディットアクションからビューでレンダリング、フォームの送信アップデートアクションで保存
- 基本モデルのデストロイメソッドはSQLのデリート文を実行してテーブルからレコードを完全に消してしまう
しかしレコードに残したまま削除状態にもできる。目的としてはユーザーの復活がある
- テーブルのレコードを作成更新する時にはエラーメッセージを出してくれるバリデーションを設ける

### レコードの取り出しと検索
- `find_by`はカラムを使ってレコードを検索、最初に一致したものを返す
- クエリーメソッドを使うと検索条件を読みやすいコードで記述できる
- 一番使われるのは```where```メソッド
- プレースホルダーがあると単純なwhere文では作れない検索条件を指定できる


### リソースとパスの指定
- `link_to,redirect_to`メソッドではパスの指定ができる
- コントローラのアクションを表すパスを「`リソース名＿path`」の形でメソッド取得できる
例：　`index...books_path /books`
     `show....book_path(book) /books/id`
　　　↑でidパラメータが取れる
- RESTは機能ではなくリソースを中心にして物事を考えること
- present?で空か確認できる<-バリデーション



### コントローラの変更
`def search
@books = book.search(params[:q])`
*qは検索ワード

### モデル追加
`render index
end`
さらにモデルクラスに追加で
- アクションは短めに
- 長くなりそうな場合はモデルクラスに機能を移す
- コントローラとテンプレートは別のオブジェクトなので使えるメソッドは基本変わる
- タグをタグとして出力するには`<%== %>`を使う
- ヘルパーモジュールは全てのテンプレートにミックスインをされるヘルパーモジュールとコントローラには特別な関係がない


- `image_tag`メソッド
`image_tag`(“画像ファイル名”,”ハッシュでオプション”)

- レイアウトテンプレートは全体の枠となる
- プレースホルダーがあると単純なwhere文では作れない検索条件を指定できる
- インスタンス変数`@book`の綴りをまちがえると、NoMethodErrorというエラーが表示される

### モデルとフォームの連携の流れ
- コントローラでモデルを取り出し、ビューでレンダリングし、編集した内容をコントローラでモデルに保存
- フォームの送金先のパスとHTTPメソッドを自分で指定したいときはurlオプションとメソッドオプションを指定
`form_for @book, URL: book_path(@book),method: :path`
- renderメソッドにおいての、`form: form`は部分テンプレにローカル変数formを渡すという指定の意
<br>

- ラジオボタン、選択リスト、日付と時刻の選択、ファイルのアップロードもできる
- 時としてストロングパラメータの無効化が必要。ただし一般公開時は必要
- config/application.rbからメッセージの日本語化ができる『国際化』gemからも設定できる
- Yamlとはデータ形式またはファイル形式の１つで配列やハッシュを人間に読みやすい形で記述できるようにしたもの

### テスト駆動開発
テストを書く→テストが失敗することを確認する→テストが成功するように実装する→リファクタリング(テストが成功状態のままプログラムを綺麗にする)
- テストコードは本体コードよりも丁寧に書く
- アサーションメソッドである条件が成立しているかどうかをチェックする
- テスト前にはマイグレーションを実行しないとエラーが発生することがある
- 自分のアカウント情報を扱う場合、単独リソースとして扱い、resource :(扱う情報)は単数で表記

### モデル間の関連付け  
1対多　has_many :複数形、belongs_to :単数  
1対1　has_one   :単数、　belongs_to :単数

### リソースのネスト
- ネストされたリソースは
`resources :books do 
  resources :zaikos 
end`
でネストできる
- いいね機能を実装するにはvoteモデルを利用することでできる