【Rails】Railsチュートリアル　第４章　復習用

<h2>はじめに

Railsチュートリアルで私が一番苦手な分野である第４章をアウトプットのために記述していく
最近プログラミング始めたビギナーなので間違いがあったら先輩方に訂正していただきたい
この記事をかなり参考にした
https://qiita.com/take_webengineer/items/265f29b77f3126d3a9df

<h4>単純なオブジェクト指向(?)のはなし</h4>

・クラスの下にインスタンスがある（Stringクラスの中に"foobar"という文字列がある）
・詳しくはこちらのサイトが解説している(スマホの例がわかりやすい)　https://type.jp/et/feature/25261/
・メソッドとは、オブジェクトに渡されるメッセージ( "foobar".length のlengthがメソッド)
・Rubyはメソッドの引数のカッコ()を省略して記述できる。
・ハッシュがメソッド呼び出しの最後の引数である場合は、波カッコを省略できる
```Ruby
# メソッド呼び出しの丸カッコは省略可能。
stylesheet_link_tag("application", "data-turbo-track": "reload")
# 上は以下のように書いても同じ
stylesheet_link_tag "application", "data-turbo-track": "reload"
# 最後の引数がハッシュの場合、波カッコは省略可能。
stylesheet_link_tag("application", { "data-turbo-track": "reload" })
# 上は以下のように書いても同じ
stylesheet_link_tag("application", "data-turbo-track": 
```

<h4>クラス(まじ苦手)</h4>

```ruby:class
    class Word < String             # WordクラスはStringクラスを継承する
        def palindrome?
          self == self.reverse        # selfは文字列自身を表します
        end
    end
        => :palindrome?
```

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

・このコードのWord.new("level")は、Wordクラスの直下に"level"文字列を入れるということ
・s = String.new("foobar")のときとイメージは同じ（このコードの意味はs = "foobar")
・超極論だがs = Word.new("level")は s = "level" である。(最後のコードは "level".lengthと同じだね)
・String→Word→level(文字列)と継承しているため、Wordクラス直下は文字列であり、文字列を扱えるすべてのメソッドを継承していることになる

眠いので朝起きたら続きの組み込みクラスから勉強する
→おきた

<h4>組み込みクラス</h4>

・組み込みクラスは元からRailsにあるクラス（Object,String等）
・組み込みクラスにメソッドを追加することは<strong>基本的にない</strong>
・ただRailsではデフォでblank?という空白を判定するメソッドがRubyに追加されている

<h4>ユーザークラス</h4>

```Ruby:User
class User
  attr_accessor :name, :email

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

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

・ルートディレクトリにrbファイルを作成し、その中でクラスの定義を行う(ルートディレクトリは一番上位のディレクトリ Sample_appの直下)

```Ruby
attr_accessor :name, :email
```
・このコードはユーザー名とメールアドレス（属性: attribute）に対応するアクセサー（accessor） をそれぞれ作成している
・これを作成する理由は、「外部から変数を参照するため」と「外部から変数を編集するため」です（外部とは違うファイルのこと）


もしこのコードがなかった場合
```Ruby
# Userインスタンスを作成
user = User.new('鈴木', 33)
# 下記のように外部から直接参照しようとするとエラーになる
puts user.name
# もしくは
puts user.age
```
外部からputsを使って参照しようとしてもエラーになり参照できない。

```Ruby
# Userインスタンスを作成
user = User.new('田中', 23)
# 下記のように外部から直接変更しようとするとエラーになる
user.name = '佐藤'
# もしくは
user.age = 45
```

変更の場合も同様で、　= を使って違う値を代入しようとしてもすることができない。

そこで先ほどのコードを記述することにより
```Ruby
# Userインスタンスを作成
user = User.new('鈴木', 33)
# 下記のように参照できるようになる
puts user.name #=> '鈴木'
puts user.age  #=> 33

# 下記のように変更できるようになる。
user.name = '田中'
user.age  = 56
puts user.name #=> '田中'　
puts user.age #=> 56
```
先ほどエラーが出たものも、外部から操作ができるようになる。
以上のコード含めこちらの記事を参照させていただいた
https://qiita.com/soicchi/items/5d64bc49d0e16c7602a3

```Ruby
  def initialize(attributes = {})
    @name  = attributes[:name]
    @email = attributes[:email]
  end
```
・このinitializeメソッドは、User.newが実行されると自動で呼び出される
・attributeという引数を１つ持っている
・attributes変数は空のハッシュをデフォルトの値として持つため、名前やメールアドレスのないユーザーを作ることができます。

```Ruby
  def formatted_email
    "#{@name} <#{@email}>"
  end
```
・これは文字列を生成するだけ
・名前 <メールアドレス>となる