【第4章】rails tutorial 備忘録

## module ヘルパー

moduleを使って、provideでtitleを与えられなかった場合にデフォルトのtitleを表示させる。

```ruby:app/helpers/application/helper.rb
def full_title(page_title="")
        base_title ="Ruby on Rails Tutorial App
        if page_title.empty?
            base_title
        else
            page_title + "|" + base_title
        end
    end
```

これを適用させる

```app/views/layouts/application.html.erb
..
..
..
<title><%= full_title(yield(:title)) %></title>
..
..
.

```

##文字列
シングルクォートの場合

```
'#{foo} bar'
```
展開しない

## empty nil blank
emptyは器があるが、中身がないならtrue

nilは器も何もないなら、true

blankはnilとemptyの両方でtrueを出す

nilに.emptyを使うとNoMethodErrorになるから、nilにもなるケースがあるなら、blankを使えばいい

### unless

~でないなら
ifの反対
unless = if !

### パーセント記法
%w(aa bb cc)は["aa","bb","cc"]になる。

%Wだと式が展開される

### ブロック
(1..9).each { |I| puts 3 * I}

(1..5).each do |I|
puts I * 100
end

配列から一つずつ値を取り出して、
処理をする

## map
取り出した値に処理をして、
また、配列に入れる。
eachのブロックだと配列から出して、配列に戻さない

```
%w[a b c].map{|char| char.upcase}
=> ["A", "B", "C"]
```

## ハッシュ
シンボルとハッシュロケット
シンボルを強調する時に使うといい。

```ruby:
{:name => "kukuhana",:email => "kukuhana@gmail.com"}
```

コロンを使う場合、

```ruby:
{name:"kukuhana",email:"kuku@gmail.com"}
```

##CSS

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

```
stylesheet_link_tag 'application'
```
これはstylesheetのパス
aplicationのcssを読み込んでいる。


```
media:'all','data-turbolinks-track': 'reload'
```
上記は二つは一つのハッシュに入っているもので以下と同義
```
{ media: 'all',
                                     'data-turbolinks-track': 'reload' }
```
<%= %> で囲まれているコードを実行した結果がERbのテンプレートに挿入されるようにするもの


##コンストラクタ
リテラルコンストラクは、String.newなどの記載はせず、暗黙でオブジェクトを作成する

```
irb(main):026:0> myname = String.new("name")
=> "name"
irb(main):027:0> myname.class
=> String
irb(main):028:0> yourname = "name2"
=> "name2"
irb(main):029:0> yourname.class
=> String
irb(main):030:0> 
```



##クラスと継承
上の階層で実装されたメソッドなどは、
下の階層のクラスに継承される。

###演習
Rangeクラスの継承階層を調べてみてください。同様にして、HashとSymbolクラスの継承階層も調べてみてください。

```
irb(main):014:0> a = :a
=> :a
irb(main):015:0> a.class
=> Symbol
irb(main):016:0> a.class.superclass
=> Object
irb(main):017:0> a = {aa:19}
=> {:aa=>19}
irb(main):018:0> a.class
=> Hash
irb(main):019:0> a.class.superclass
=> Object
irb(main):020:0> 
```

ハッシュのデフォルト値を設定できる。
後々、使えそう
```
irb(main):030:0> h = Hash.new(0)
=> {}
irb(main):031:0> h[:foo]
=> 0
```

##コントローラクラス　重要
各コントローラはapplicationコントローラを継承しているので、
ログインしているかなどのフィルターをここに書いておくと、すべてのコントローラでそのメソッドが使える。

##ユーザクラス

```ruby:example_user.rb
class User
  attr_accessor :name, :email

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

  def formatted_email
    "#{@name} <#{@email}>"
  end
end
```

attr_accessor :name, :email
はつまり、器を作っている。
attr_accessor :nameは@name
attr_accessor :emailは@email
を意味している。

attr_accessor :nameは以下のコードと同義である。

```
代入するメソッド
def title=(t)
  @title = t
end

代入したものを取り出すメソッド
def title
  @title
end

```

そこへinitializeメソッドで初期設定している。
引数に{}を指定していて、
name:~~ ,email:~~のハッシュを入れると
attributes[:name]で対応する値を代入する。
引数がなかったら、nilが入る。


initializeメソッドがなくても
器は用意してあるので
user.name
user.emailで代入できるようになる。
User.newの時に
User.new(name:"name",email:"aa@aa")としてもいい。


[わかりやすい記事](http://bryankawa.hatenablog.com/entry/2017/01/28/150537)


##感想
一週目に比べて、だいぶ理解が進んでいることを実感した。改めて、プログラミングは面白いと感じる。