メモランダム Rails tutorial　第4章

# Rails tutorial 第４章

# Rails風味のRuby
- 何度も立ち戻って理解しよう。

# 1.動機
- トピックブランチの作成、変更のコミット

## 組み込みヘルパー
- Railsの組み込み関数stylesheet_link_tagを使って、application.cssをすべてのメディアタイプで使えるようにしている。

## カスタムヘルパー
- 常套手段:タイトル空欄を防ぐため、基本タイトルを決めて、特定のページでは異なるタイトルに変更できるようなオプションを加える。
- ful_titleヘルパーの作成
- `<title><%= full_title(yield(:title)) %></title>`
- 以前のテストコードを更新し、"Home" という文字が表示されていないことを確認するテストを追加
- Homeページのビューからprovide の行を削除する必要がある。

# 2.文字列とメソッド
- Railsコンソールはirb (IRB: Interactive RuBy) を拡張して作られているため、Rubyの機能をすべて使うことができる。
- ホームディレクトリに「.irbrc」ファイルを作成。`$ nano ~/.irbrc`
- nanoエディタから離脱、ファイルを保存。
- railsコンソールの３種類
 - development（今ここ）
 - test
 - production（本番）
- Ruby APIのススメ。

## 文字列(string)
- 出力　puts = put stringの略！
- `puts "foo" == print "foo\n" 等価！
- ''の中では式展開を行わない！
- "" と　''の違いはそんなにない。

## オブジェクトとメッセージ受け渡し
- オブジェクト　＝＝　いついかなる時もメッセージに応答するもの。
- if else nil
- ' !! ' ==バンバンと読む。

## メソッドの定義
- メソッドで戻り値を明示的に指定しなかった場合
 - メソッド内で最後に評価された式の値が自動的に返される.

## titleヘルパー再び
- module ApplicationHelper
 - 関連したメソッドをまとめる方法の１つ
 - includeメソッドを使ってモジュールを読み込むことができる,railsでは不要。
  - full_titleメソッドは自動的にすべてのビューで利用できるようになっている
  
# 3.他のデータ構造

## 配列array　と　範囲演算子range
- splitメソッドを使うと、文字列を自然に変換した配列を得ることができる。`>>  "foo bar     baz".split     # 文字列を3つの要素を持つ配列に分割する
=> ["foo", "bar", "baz"]`
- 破壊的メソッド　!
- split <=> join
- to_aメソッド
- -1の便利さ

## ブロック
- .each do ||puts ~~ end == .each {|| puts ~~ }
　- 長い場合はdo..endを使う。
- ブロックの理解には相当のプログラミング経験が必要。
- map メソッド
- %w で文字列の配列を作成。
- 単体テストの例　doというキーワード　＝＝　ブロック
- `('a'..'z').to_a.shuffle[0..7].join`を分解すると・・・？

## ハッシュ{}(＝連想配列）とシンボル:

### ハッシュ
- ハッシュは配列と異なって、整数値以外のものも扱える。
- ハッシュの{}はブロックの{}とは全く別物。
- ハッシュは配列と異なって、並び順が保証されない。

### シンボル
- シンボルは文字列と異なって、クォートで囲む代わりにコロンが前に置かれている。
- -や頭に数字はダメ。

#### `{ :name => "Michael Hartl" }` == `{ name: "Michael Hartl" }`

- ハッシュのハッシュも使うことができる（ネストされたハッシュ）
- ハッシュに対してeachメソッドを実行すると、ハッシュの1つの「キーと値のペア」ごとに処理を繰り返す。
- 便利なinspectメソッド　省略はp

## CSS,再び
- uby では丸カッコは使用してもしなくても構話ない。
- ハッシュがメソッド呼び出しの最後の引数である場合は、波カッコを省略できる。


# 4. Rubyにおけるクラス

## コンストラクタ
- ""は文字列のコンストラクタ。
- メソッドがクラス自身 (この場合はnew) に対して呼び出されるとき、このメソッドを**クラスメソッド**と呼ぶ。

## クラス継承
- Rubyにおけるすべてのクラスは最終的にスーパークラスを持たないBasicObjectクラスを継承している。
 - ある単語を前からと後ろからのどちらから読んでも同じ (つまり回文になっている) ならばtrueを返すpalindrome?メソッド

- Wordクラスの中では、selfはオブジェクト自身を指す。

## 組み込みクラスの変更
- Rubyでは組み込みの基本クラスの拡張が可能
　- Ruby のクラスはオープンで変更可能であり、クラス設計者でない開発者でもこれらのクラスにメソッドを自由に追加することが許されている。

- "deified" (=神格化された) という単語が回文になっていることも、それに劣らずクールではないでしょうか

###組み込みクラスの変更はきわめて強力なテクニックですが、大いなる力には大いなる責任が伴います (訳注: 「スパイダーマン」の名台詞)

## コントローラクラス
- Railsコンソールでは、その中からコントローラのアクション (実はメソッド) を呼ぶこともできる。
- 実は、Railsは確かにRubyで書かれていますが、既にRubyとは別物なのです。Railsのクラスは、普通のRubyオブジェクトと同様に振る舞うものもありますが、多くのクラスにはRailsの魔法の粉が振りかけられています。Railsは独特であり、Rubyとは切り離して学習する必要があります。

## ユーザークラス
- これからは、アプリケーションのルートディレクトリにexample_user.rbファイルを作成し、そこにリスト 4.17のように書くことにします。

###  `attr_accessor :name, :email` 
- ユーザー名とメールアドレス (属性: attribute) に対応するアクセサー (accessor) をそれぞれ作成
- アクセサーを作成すると、そのデータを取り出すメソッド (getter) と、データに代入するメソッド (setter) をそれぞれ定義してくれる。
 - インスタンス変数@nameとインスタンス変数@emailにアクセスするためのメソッドが用意される。
 - インスタンス変数をコントローラ内で宣言するだけでビューで使えるようになる
 - ** インスタンス変数は常に@記号で始まり、まだ定義されていなければ値がnilになる **
 
### initializeは、Rubyの特殊なメソッド
- User.newを実行すると自動的に呼び出されるメソッド

### formatted_emailメソッド
- 文字列の式展開を利用して、@nameと@emailに割り当てられた値をユーザーのメールアドレスとして構成
　- @ 記号によって示されているとおり、@nameと@emailは両方ともインスタンス変数なので、自動的にformatted_emailメソッドで使えるようになる。

# 5.最後に
- 第5章では、この章で学んだ内容をサンプルアプリケーションの開発に活かしていきます
- 慣習的なチェックとして、リモートリポジトリにpushしたりHerokuにデプロイする前に、テストスイートを流して既存の振る舞いに影響がないかを (念のため) 確認しておきます。

# まとめ
- Rubyは文字列を扱うためのメソッドを多数持っている
- Rubyの世界では、すべてがオブジェクトである
- Rubyではdefというキーワードを使ってメソッドを定義する
- Rubyではclassというキーワードを使ってクラスを定義する
- Railsのビューでは、静的HTMLの他にERB (埋め込みRuby: Embedded RuBy) も使える
- Rubyの組み込みクラスには配列、範囲、ハッシュなどがある
- Rubyのブロックは (他の似た機能と比べ) 柔軟な機能で、添え字を使ったデータ構造よりも自然にイテレーションができる
- **シンボルとはラベルである。追加的な構造を持たない (代入などができない) 文字列みたいなもの**
- Rubyではクラスを継承できる
- Rubyでは組み込みクラスですら内部を見たり修正したりできる
- 「deified」という単語は回文であるw