rails tutorial4章進めた時の覚書

カスタムヘルパー
> Railsのビューでは膨大な数の組み込み関数が使えますが、それだけでなく、新しく作成することもできます。新しく作ったメソッドはカスタムヘルパー と呼ばれます

作り方
full_titleヘルパーを製作
helpers/application_helper.rb に、full_titleヘルパーを定義する。

```rb
module ApplicationHelper

  # ページごとの完全なタイトルを返します。
  def full_title(page_title = '')
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      page_title + " | " + base_title
    end
  end
end
```

> コンソールの中で何をしようとも、何かを壊すことはまずありえないので、ご安心ください。

いいことを聞いた

```
'#{foo} bar'     # シングルクォート内の文字列では式展開ができない
=> "\#{foo} bar"
```

文字列の入った変数同士を、間にスペースを入れて出力するには式展開を使って結合すると良い。

```
first_name = "Michael"
last_name = "Moore"
first_name + last_name
==> MichaelMoore # NG / 半角スペースが入らない

"#{first_name} #{last_name}"
==> Michael Moore # OK / 半角スペースが入る
```

> Rubyでは、あらゆるものがオブジェクトです。文字列やnilですらオブジェクトです。

ほお。

##「オブジェクトとは何であるか」という直感を養う
Q. オブジェクトは何をするか？
A. いついかなる時もメッセージに応答するもの

```
>> "hello".length # helloという文字列(オブジェクト)に "length" というメッセージを送っている
=> 5

lengthがメソッド
```

> Rubyでは、メソッドがtrueまたはfalseという論理値（boolean）を返すことを、末尾の疑問符で示す慣習がある

面白いな。

```
>> "hello".empty? #helloは空ですか？
=> false # 違いますよ〜
>> "".empty? #""は空ですか？
=> true # せやで
```

console内で、複数行にわたるコード書くにはどうするんだ？
複数行コピってconsoleに貼り付けてenterでいけた。
一行づつ叩いて行っても実行できた。

引数にデフォルト値を含める

```rb
def string_message(str = '') #デフォルト値にからの文字列を設定
```

Rubyのメソッドは最後に評価された値が自動的に返される

引数の中の、
*the_function_argument*は何だ...
引数に名前をつけてるようだ。

```rb
def string_message(the_function_argument = '')
```


##module ApplicationHelperとは？
- モジュールは、***関連したメソッドをまとめる方法***の１つ
- `include`メソッドを使ってモジュールの読み込みができる(モジュールの読み込みをmixinと呼ぶ)
- Railsでは自動的にヘルパーモジュールを読み込むため、`include`行を書く必要がない


##配列
配列から取り出すときに、-1を使うと末の値が取得できる。

```
number_array = [0, 1, 2]
number_array[-1]
=> 2
```

配列が応答する様々なメソッド

- .empty?
- .include?
- .sort
- .reverse
- .shuffle

配列の内容を変更したい場合、破壊的メソッドを使う
破壊的メソッドは、下のメソッドの末尾に***!***を追加したものを使うのがRubyの慣習

`a.sort!` など。

配列に追加するときは`push`メソッドを利用 `<<` でも追加できる。

文字列を配列に変換する `split` メソッド
配列を文字列に変換する `join` メソッド


```
>> a
=> [42, 8, 17, 6, 7, "foo", "bar"]
>> a.join       # 単純に連結する
=> "4281767foobar"
>> a.join(', ') # カンマ+スペースを使って連結する
=> "42, 8, 17, 6, 7, foo, bar" # なん一回合体させたやつが、ちゃんと元の形で分割されるんや？？？
```

##ブロック
1行の時`{}`使う

```rb
(1..5).each { |i| puts 2 * i }
```

基本使うときは複数行
do end で囲む。

```rb
(1..5).each do |i|
    puts 2 * i
end
```

##ハッシュ
ハッシュは本質的には配列と同じだが、インデックスとして整数値以外を使えるのが配列と違う
ハッシュは並び順が保証されない
要素の順序が重要ならば、配列を利用する

キーと値のペアを波カッコで囲んで表記
キーと値のペアを持たない場合空のハッシュ

```rb
user = {}     #空のハッシュ
user["first_name"] = "Michael" # キー: first_name, 値: Michael
```

ハッシュの波カッコは、ブロックの波カッコとはまったく別物
[]ではなく、 `ハッシュロケット`でリテラル表現すると簡単に記述できる
※リテラルとは: 数値や文字列など、データ型の値を直接記述できるように構文として定義されたもの。ちょっとよくわかってない

```rb
#ハッシュロケット使わない
user["first_name"] = "Michael"
user["last_name"] = "Moore"

#ハッシュロケット使用
user = { "first_name" => "Michael", "last_name" => "Moore" }
```

###シンボル
Railsでは、ハッシュのキーを記述する際、文字列よりも*シンボル*を使う方が普通
シンボルは文字列と似ているが、クォーとで囲む代わりにコロンが前に置かれる点が違う
Ruby以外ではごく一部の言語にしか採用されていない特殊なデータ形式
見慣れないな

```
"name".split('')
=> ["n", "a", "m", "e"]

>> :name.split('') #待って、これ入力すると上と同じ結果になってるんじゃないの？？エラー出てるやん。 :name は、文字列 name として扱われるんとちゃいますの？？
NoMethodError: undefined method `split' for :name:Symbol
```

何してる？

```rb
stylesheet_link_tag 'application', media: 'all',
                                   'data-turbolinks-track': 'reload'
```

`stylesheet_link_tag`メソッドを、2つの引数で読んでいる
`'application', `
`media: 'all', data-turbolinks-track': 'reload'`

tabolinksはrailsの機能

##クラスについて
メソッドをまとめたものがクラス
クラスから*インスタンス*が生成されることで、*オブジェクト*が作成される。

```
した二つは同じ
s = "foobar"
s = String.new("foobar")
```

Rubyでは組み込みの基本クラスの拡張が可能
真に正当な理由がない限り、組み込みクラスにメソッドを追加することは無作法であると考えられています

##ユーザクラス
Railsでは、インスタンス変数をコントローラ内で宣言するだけでビューで使えるようになる、といった点に主な利用価値があります
インスタンス変数は常に`@`で始まる

rubyの特殊なメソッド、 `User.new`を実行すると自動で呼び出されるメソッド
この`initialize`メソッドは、attributesという引数を一つとる

```rb
def initialize(attributes = {})
    @name  = attributes[:name]
    @email = attributes[:email]
  end
```