Rails Tutorial 第4章学習編

#Rails Tutorial 第4章で(。´・ω・)ん?って思ったところ

前提知識と復習でアウトプットしているからだと思いますが、
この章は特に(。´・ω・)ん?って思ったところはないです。
動画もテキストも非常に分かりやすかったです。

##Rails 第4章　簡単な内容のおさらい
第四章はRails風味のRubyです。こんなに分かりやすいオブジェクト指向は初めてです。
ProgateのPython、TECH::CAMPのRubyでも学習しましたが。。。
(゜-゜)う～ん オブジェクト指向それって美味しいの?って感じでした。

よく説明に・・・全てのモノはオブジェクトです。
人も一つのオブジェクト、車も一つのオブジェクト
ジョンという人がいる。ジョンは人に属している。
人は職業・性別・年齢などの要素を持っている。。。
こんな内容に沿ってコードを書かされて(。´・ω・)ん?って感じになります。

####私の言葉でのオブジェクト指向を説明すると・・・

```ruby
"文字列"があります。
オブジェクト指向で記述されていると、
"12345".length #文字をカウントするメソッドが使える。
"12345".to_i   #文字列を整数に変換するメソッドが使える。

.lengthメソッド・.to_iメソッドを定義していないのに何で使えるの?
　⇒　答えはオブジェクト指向で書かれているからです。

まだ、(。´・ω・)ん?って感じですよね

実は"文字列"と書けば文字列と認識されていますが、
String.new("文字列")というコードの省略形です。
文字列(String)クラスのオブジェクト"文字列"を作りなさいという意味なんです。

予め文字列(String)クラスに様々なメソッドが用意されています。
String.new("")で生成したオブジェクトは文字列オブジェクトなので定義済みメソッドが使えるのです。

文字列クラスで.to_iメソッドが用意されているので、
新しく生成した文字列も.to_iなどの様々なメソッドが使えるという事です。

オブジェクト指向の最大の利点は、
文字列は必ず文字列オブジェクトとして生成する事で.to_iなどメソッドを共有出来きる事です。('ω')ノ
文字列クラスに新しいメソッドを追加すれば、全ての文字列オブジェクトで使用できるって事です。
Progateで学んだ時は(。´・ω・)ん?でしたが、今になって便利さが分かりました(´-ω-`)
```

####クラスと継承

```ruby
"文字列"はStringクラスに属しています。
何処に属しているか確認する為に.classメソッドが使えます。

s = "文字列"

s.class
⇒ String

実はStringクラスもObjectクラスに属しています。
>> s.class.superclass             # superclass : 親クラスを調べる
=> Object

Objectクラスも更に上のクラスに属しています。
>> s.class.superclass.superclass 
=> BasicObject

BasicObjectは更に上のクラスに属している？　答えはNoでした。nilは存在しないという意味です。
>> s.class.superclass.superclass.superclass
=> nil

なんでこんな事をしているのかというと・・・機能を引き継ぐ為です。('ω')ノ
Objectクラスの下には、String(文字列)・Integer(整数)・Array(配列)クラスなどがあります。
配列も、整数も、文字列も、.lengthメソッドが使えますよね。
３つそれぞれ追加していくのは大変ですよね。
なのでObjectに追加して下位クラスで利用出来るようにすれば手間が省けます。

この様に上位のクラスで定義されたメソッドを下位メソッドに引継ぐ事を『継承』と言います('ω')ノ

#class <クラス名>で新しいクラスを定義できます。
>> class Word < String             # < StringでStringクラスを継承出来ます('ω')ノ
>>   # 文字列が回文であればtrueを返す
>>   def palindrome?　　　　　　　　# defで新しいメソッドを定義できます。
>>     self == self.reverse        # selfは文字列自身を表します
>>   end
>> end
=> :palindrome?

```

#### Ruby 基礎 

```ruby
$ rails console

#整数の足し算
>> 17 + 42
=> 59

#文字列の結合
>> "foo" + "bar"    # 文字列の結合
=> "foobar"

#変数の代入
>> first_name = "Michael"
=> "Michael"

#文字列の式展開　これ便利('ω')ノ　Railsでも使うよ。
>> "#{first_name} Hartl"
=> "Michael Hartl"

#式展開('ω')ノ
>> first_name = "Michael"
=> "Michael"
>> last_name = "Hartl"
=> "Hartl"
>> first_name + " " + last_name    # 苗字と名前の間に空白を入れた結合
=> "Michael Hartl"
>> "#{first_name} #{last_name}"    # 式展開を使って結合 (上と全く同じ)
=> "Michael Hartl"

#文字列の出力 (puts)
>> puts "foo"     # 文字列を出力する
foo
=> nil　#戻り値はnilは「何にもない」

#文字列の出力 (print)
>> print "foo"    # 文字列の画面出力 (putsと同じだが改行しない)
foo=> nil

>> print "foo\n"  # \nは改行。これでputsと同じ出力になる。
foo
=> nil

#''シングルクォーテーションと""ダブルクォーテーション
>> '#{first_name} #{last_name}'    # ''は式展開できない。
=> "/#{first_name} #{last_name}"

>> "#{first_name} #{last_name}"    # ""は式展開できる。
=> "Michael Hartl"

# empty?メソッド
>> "foobar".empty?
=> false
>> "".empty?
=> true

#条件分岐 (if) ・.include?("文字列") ・.nil? メソッド
>> if s.nil?
>>   "The variable is nil"
>> elsif s.empty?
>>   "The string is empty"
>> elsif s.include?("foo")
>>   "The string includes 'foo'"
>> end
=> "The string includes 'foo'"


# バン!バン! 強制的に論理値(True/False)で出力する
>> !!nil　#Rubyオブジェクトはnilだけfalse
=> false

>> !!0  #その他のあらゆるRubyのオブジェクトはtrue
=> true
```

これで半分程度の内容ですかね。結構ボリューム多いです。
配列やハッシュといった重要な内容がこの後に続くのですが・・・
全部書くと著作権的にどうなのかなと思うのでシンボルについて書いたら終わりッス('ω')ノ

####シンボルと整数、文字列について

```ruby
#これはハッシュというラベル付配列です。
user1 = { "name"=>"test_user", "email" => "test_user@example.com" }
user2 = { "name"=>"test_user", "email" => "test_user@example.com" }

user1 == user2
=> false

同じ内容なのに falseになるのはなんで？('ω')ノ　
実はobject_idというモノが違っているから、異なっているのを確かめてみてください。
user1.object_id　
user2.object_id

このobject_idってデータの格納されている場所みたいなものです。
文字列でも試してください。実行する度にobject_idが代わるんです。
"name".object_id
"name".object_id
"name".object_id

次に数字です。数字はどうでしょうか？　数字は常に同じobject_idになるんです。
1.object_id
1.object_id
1.object_id

最後に・・・シンボルです。 シンボルも数字と同じくobject_idが変化しないんです。
:name　#:+文字列をシンボルって言うのですが、object_idにラベル付けたモノって思ってください。

なんでこんな事をするかというと、文字列を使うよりも処理速度が速くなるからです。('ω')ノ
なのでハッシュのラベル名は文字列よりもシンボルの方が好まれます。

◎　user = { :name=> "test_user" , :email => "test_user@example.com" }
△　user = { "name"=>"test_user", "email" => "test_user@example.com" }

更にもっと簡単に記述もできます。
user = { :name=> "test_user" , :email => "test_user@example.com" }
user = { name: "test_user", email: "test_user@example.com" }

```


#### カスタムヘルパー
自分でメソッドを定義する場合にヘルパーというファイルに記述します('ω')ノ

```rb:app/helpers/application_helper.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
```

##感想
第四章は非常に内容が濃くて面白いです。
自分で様々なメソッドを定義する為にはRubyの知識が必要になってきますね。
いろんなメソッドが存在するけど、ほんの僅かしか覚えていないので
Railsの学習が終わったら、Rubyもきちんと学習しないと駄目ですね・・・。
はぁー、先が長い長い（　＾ω＾）・・・。