Railsチュートリアル 第4章

##Railsコンソールの設定
Railsコンソールはirb(IRB:Interactive RuBy)を拡張して作られているため、Rubyの機能を全て使うことができる。

```
$ nano ~/.irbrc
```

下記の設定を書くと、irbのプロンプトが簡潔な表示に置き換わる。

```
IRB.conf[:PROMPT_MODE] = :SIMPLE
IRB.conf[:AUTO_INDENT_MODE] = false
```

##後続ifとunless
if：条件式が"真"のときに実行される

```
puts "x is not empty" if !x.empty?
```

unless：条件式が"偽"のときに実行される

```
>> string = "foobar"
>> puts "The string '#{string}' is nonempty." unless string.empty?
The string 'foobar' is nonempty.
=> nil
```

##メソッド
###mapメソッド
配列の要素の数だけブロック内の処理を繰り返し、結果として作成された配列を返す。
map!は元の値を書き換える。

```
オブジェクト.map { |変数|
  # 実行したい処理
}
```

```
>> (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"]
```

mapのブロック内で宣言した引数(char)に対してメソッドを呼び出している場合は、省略記法が一般的。

```
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase)
=> ["a", "b", "c"]
```

###to_a
配列に変換する

```
>> (0..9).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 }が、ブロックと呼ばれる部分。

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

また、ブロックである事を示すには波カッコで囲むが、下記のようにdoとendで囲んで示すこともできる。
短い１行のブロックには波カッコを使い、長い１行や複数行のブロックにはdo..endを使う。

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

そう考えると、単体テストもブロックであることがわかる。
このtestメソッドは、文字列(説明文)とブロックを引数にとり、テストが実行されるときにブロック内の文が実行されている。

```
test "should get home" do
  get static_pages_home_url
  assert_response :success
  assert_select "title", "Ruby on Rails Tutorial Sample App"
end
```

##ハッシュ
ハッシュは本質的には配列と同じだが、インデックスとして整数値意外のものも使える点が配列とは異なる。(そのため、他の言語ではハッシュを連想配列と呼ぶこともある)
ハッシュは、キーと値のペアを波カッコで囲んで表記する。
配列と似ているが、ハッシュでは要素の並び順が保証されないため、要素の順序が重量である場合は、配列を使う必要がある。

```
>> user = { "first_name" => "Michael", "last_name" => "Hartl" }
=> {"last_name"=>"Hartl", "first_name"=>"Michael"}
```

上記では、ハッシュのキーとして文字列を使っていたが、Railsでは文字列よりもシンボルを使うのが一般的。:nameのように表す。

```
>> user = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> user[:name]              # :name に対応する値にアクセスする
=> "Michael Hartl"
>> user[:password]          # 未定義のキーに対応する値にアクセスする
=> nil
```

また、シンボルとハッシュロケットの組み合わせを、下記のようにキーの名前の後にコロンを置く記法も同じように使える。

```
{ name: "Michael Hartl", email: "michael@example.com" }
```

##CSSを追加する
ハッシュを学んだので、下記が理解できるようになっている。

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

まずは、丸カッコがないが、Rubyでは丸カッコは使用しなくてもいいので、下記の２つの行は等価となる。

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

次にmedia引数はハッシュだが、波カッコがない点が不思議。
ハッシュはメソッド呼び出しの最後の引数である場合は、波カッコを省略できるためであり、下記の２つの行は等価となる。

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

Rubyでは改行と空白を区別していないため、上記のように途中に改行が含まれていても問題ない。
		
以上の事から、stylesheet_link_tagメソッドは、２つの引数で呼ばれており、最初の引数はである文字列は、スタイルシートへのパスを示す。
次の引数であるハッシュには２つの要素があり、最初の要素はメディアタイプを示し、次の要素はturbolinksという機能をオンにしている。
最後に上記を読み込んで生成されたHTMLソースは下記となる。

```
<link data-turbolinks-track="true" href="/assets/application.css"
media="all" rel="stylesheet" />
```

##クラス
###クラスの継承
String ⇨ Object ⇨ BasicObject ⇨ nil(スーパークラスを持たないという事)
Array、Hashなどのクラスも上記と同様である。これが"Rubyではあらゆる物がオブジェクトである"という事。

```
>> s = String.new("foobar")
=> "foobar"
>> s.class
=> String
>> s.class.superclass
=> Object
>> s.class.superclass.superclass
=> BasicObject
>> s.class.s
```

###クラス継承の例

```
>> class Word < String             # WordクラスはStringクラスを継承する
>>   # 文字列が回文であればtrueを返す
>>   def palindrome?
>>     self == self.reverse        # selfは文字列自身を表します
>>   end
>> end
=> :palindrome?
```

上記の様に、WordクラスはStringクラスを継承しているため、palindrome?メソッドだけでなく、Stringクラスが扱える全てのメソッドがWordクラスでも扱える様になる。

```
>> s = Word.new("level")    # 新しいWordを作成し、"level" で初期化する
=> "level"
>> s.palindrome?            # Wordが回文かどうかを調べるメソッド
=> true
>> s.length                 # WordはStringで扱える全てのメソッドを継承している
=> 5
```

###selfキーワード
selfとは、オブジェクトそのものを指している。

###attr_accesssorメソッド
クラスにインスタンス変数を読み書きするためのアクセサメソッドを定義するメソッド。
アクセサメソッドは、外部インスタンスのインスタンス変数を参照したり変更するために定義する。

###initialize
User.newを実行すると自動的に呼び出されるメソッド。