rails学習　1日目

#Ruby on Rails5速習実践ガイドchapter1

## 1-1-6 クラスとインスタンス(p.6)

・クラスとインスタンスの関係
クラスは親でインスタンスは子の関係になっており、クラスの中にたくさんのインスタンスが存在している。
![Untitled-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/815476/98d48b4d-0a35-1e67-99ee-c65f5ec7b5cc.jpeg)
例を出すと人間という大枠（クラス）の中にAさん（インスタンス）Bさん（インスタンス）Cさん（インスタンス）Dさん（インスタンス）が存在しているということになる。

## 1-2-5 ローカル変数とインスタンス変数の違い
|種類|特徴|
|:---|:---|
|ローカル変数|その場限りの一時的な変数。定義したメソッド内でしか使うことができない|
|インスタンス変数|オブジェクトの保有する変数。インスタンス内で定義するとそのインスタンスないのどのメソッドにも利用できる|

例）

```Ruby
class MyClass
 def method_1
  @number=100
 end

 def method_2
  @number  #他のメソッド(method_1)で定義した@numberを別のメソッド(method_2)で利用できる
 end
end
```

## 1-2-7　ゲッターやセッターを簡単に定義する（attr_accessor）の使い方
@nameなどのインスタンス変数をちゃんと使おうとすると次の2つを実行しなければならない。
1.作成した情報の名前(name)を@nameに代入して使えるようにするためのメソッドを定義する
2.@nameを表示させるためのnameメソッドを定義する

```Ruby
class User
 def name=(name) #1.
  @name = name
 end

 def name　#２.
  @name 
 end
```

ここまで来て初めて＠nameを使えるメソッドが完成する。
...しかしめんどくさい。

```Ruby
class User
 attr_accessor :name
end
```
attr_accessorを使うことによって一気にすっきりとした。

## 1-2-8　住んでいる場所やEメールアドレスを持たせる（attr_accessorの具体的な使い方）
attr_accessorには様々な属性をつけることができる

```Ruby
class User
 atte_accessor :name, :address, :email
end
```
それぞれの属性を使いたい時は以下のようにする

```Ruby
user = User.new
user.name = "小田井優"
user.address = "東京"

def profile  #名前と出身を表示させるメソッドを作った
 "#{name}(#{address})"
end

user.profile　#userの名前と出身をまとめて表示するprofileメソッドを実行した
=> "小田井優(東京)"
```

nameやaddressを使ってuserの情報を記入、呼び出しできる。

## 1-3-4-2　当てはまらない場合に分岐するunless　(unlessの使い方)
ifは条件の結果が真だった時に処理を実行するがunlessは条件の結果が偽のときに処理を実行する。
（ifの逆の処理をする）

## 1-3-4-3　後置if
普段のifが後ろについた形。
else等はつけることができず１行だけに作用するif

```Ruby
puts 'おはようございます'　if true　　#出力される

puts 'お疲れ様でした'　if false　　#出力されない
```
上のコードは「もし結果がtrueならばputsを出力する」になる
結果はtrueなので「おはようございます」が出力される

##1-3-6 ハッシュ
普通の配列だと欲しいの値を出そうと思ったら番号（何番目か）を指定しなければならない。
これは配列の情報が多くなればなるほど不可能になっていく。
そこでハッシュを使い、値それぞれにあだ名（キー）みたいなものをつけていく。
そうすることであだ名を入力すれば自動的にそれに紐づいた値が出てくる。


```Ruby
 jinnkou ={ tokyo: 13636222, kanagawa: 9145572 }
         #{あだ名（キー）:東京の人口,あだ名（キー）:神奈川の人口}

puts jinnkou[:tokyo]
=> 13636222
```
[]の中には：を入れてあだ名（キー）をいれる

## 1-4-1 initialize
Rubyで「〇〇.new」を実行する時は必ず〇〇のクラスの中のinitializeが実行される。
テーブルのカラムに対応する値を入れれるようにする
例えばname,address,emailカラムがあるUserテーブルに新しい情報を入れる時、
initialize(name, address, email)と書くと、「カッコの中の１番目が名前、２番目が住所、３番目がメアドに対応させるよ」といった操作をする

```Ruby
class User #User.newのときにinitializeが使える
　def initialize(name, address, email)
   @name = name
   @address = address
   @email = email
 end
end
```
```Ruby
user = User.new("大場寧子","東京都","nil")
                 # ||       ||      ||
　　#initialize(  name   ,address, email)
```

## 1-4-2 メソッドの呼び出しに制限をかける(private)
セキュリティ面により誰もがメソッドを使えると個人情報の流失等の問題になってしまうためprivateメソッドを使って外からメソッドを使えないようにする。

## 1-5-2 モジュールによる共通化(Mix-in)
規模の小さいメソッド（処理が一つだけだったり処理自体が簡単だったり）をモジュールとしてひとかたまりにし、様々なクラスで使えるようにする。

```Ruby
#価格についてまとめたモジュール
module PriceHolder
 def total_price
  price*Tax.rate
 end
end

class Product
 include PriceHolder
 attr_accessor :price
end

class OrderedItem
 include PriceHolder
 attr_accessor :unit_price, :volume

#税抜き単価*数量
 def price
  unit_price*volume
 end
end
```

価格に消費税率をかけて戻り値を出す処理をPriceHolderモジュールとして、そのPriceHolderモジュールをそれぞれのクラスに使っている。モジュールを使う時はincludeを使う。

## 1-7-1 nilガード
```Ruby
number ||=10
```
もしもnumberがあればnumberを使い、なければnumberに10を代入したnumberが使われる。

## 1-7-2 ぼっち演算子 &.
例えばUserテーブルはあるがobject.nameとコードを打っても、まずobjectテーブルがないのでエラーが表示される。しかしぼっち演算子object&.nameを使うとテーブルがない場合はエラーではなくnilを戻り値として返すようになる。

## 1-7-3 ％記法

```Ruby
ary1 = ['apple', 'banana' ,'orange']
# %記法を使うと
ary1 = %w[apple banana orange]
```
%記法を使うと’’などが省略できる。

## 1-7-4 配列の各要素から特定の属性だけを取り出す(mapメソッド)

```Ruby
class User
 attr_accessor :name, :address
end

user1 = User.new(name:'大場寧子', address:'東京都')
user2 = User.new(name:'小芝美由紀', address:'千葉県')
user3 = User.new(name:'小田井優', address:'神奈川県')

users = [user1,user2.user3]
```
この時、それぞれのuserの名前だけの配列が欲しい場合は、mapメソッドを使い

```Ruby
names = users.map(&:name)
=>["大場寧子","小芝美由紀","小田井優"]
```
このように　元の配列.map(&:欲しい情報) とすると欲しい情報だけの配列ができる。
##  その他勉強になったことメモ

1.require：ソースコード（ここではuser.rb）を読み込む時に使う

```Ruby
> require './user.rb'
```
2.returnを使うタイミング
>メソッドを実行した時に返ってくる値のことを「返り値」という。基本的にメソッドは実行されると何かしらの返り値をくれるが、返り値をくれるのはメソッドが全て実行し切った時になる。メソッドの途中で返り値が欲しい場合はreturnを使い返り値を取得する。