Ruby on Rails備忘録

# 初めに
これはRailsを触っている中で疑問に思ったことをただメモするだけのものになります。
少し`Flask`をかじっていたので「**Flaskでいうところの...**」みたいな表現多め。


# MVCモデルって何
`Model`、`View`、`Controller`のそれぞれの頭文字からきているモデルのこと
## Modelの役割
データを処理したりする部分のこと。`Controller`とデータベースの仲介役的な立ち位置。

## Viewの役割
ユーザーが実際に見る画面のこと。HTMLとかの部分。
ユーザーのリクエストを`Controller`に渡す役割もある。

## Controllerの役割
`View`と`Model`の間にいる存在。司令塔的な立ち位置。
`View`からのリクエストを`Model`に指示したりする。

### まとめ（個人的解釈）
`View`が注文（リクエスト）を受け取り`Controller`に送る。
`Controller`は送られた注文をもとに`Model`に注文の商品（データ）をとってくるように指示。
`Model`は指示された内容のデータをデータベースからとってくる。
みたいな流れ。

# gemって何
- RubyGemsが公開しているパッケージのこと
- パッケージを管理しているシステムの名前
らしい。
Pythonでいう`pip`とか`conda`的な感じかな？

## Gemfile
gemパッケージを管理するためのファイル。環境に必要なパッケージがまとめられているやつ。作成したいRailsアプリのルートディレクトリに初めから入っている。

```:コマンドプロンプト
gem 'gem名','バージョン指定'
```
こんな感じで`gem名`と`バージョン`がまとめられている。

## bundler
gemの一種で複数のgemのパッケージ間の依存関係を保ちながらパッケージをインストールしてくれるやつ。これのおかげでバージョン間のトラブルを避けることができる。
```:コマンドプロンプト
bundle install
```
このコマンドで`Gemfile`に入っているパッケージをインストールしてくれる。

# Ruby on Rails
プログラム言語`Ruby`で動くwebアプリケーションフレームワークのこと。
`Python`でいうとことの`Flask`とか`Django`みたいなもん。

## Rubyでよく使う構文
### Pythonでいうfor文
```ruby
配列.each do |変数名|
```
`do`忘れがち。

## Railsでアプリケーションを作成する方法
アプリ開発に必要最低限なファイルはRailsのコマンドを使って作成する。
```:コマンドプロンプト
rails _Railsのバージョン_ new アプリケーション名
```
`Rails`のバージョンは`rails -v`で確認できる。アプリケーション名は任意。
実行すると指定したアプリケーション名のフォルダが作成される。そのフォルダの中にアプリ開発に必要なファイルやフォルダも同時に作成されている。

## データベースの作成方法
Railsでのデータベースの作成は以下のコマンドを使う。
```:コマンドプロンプト
rails db:create
```
作成されるデータベースは`config/database.yml`にあるファイルをもとにして作られるらしい。初期は`sqlite3`でデータベースが作成されるぽい。

データベースを作ったら次にこのコマンドを実行する。

```:コマンドプロンプト
rails db:migrate
```
これでデータベースの作成はおしまい。
ここでデータベースに変更を加えることができる。何かしらデータベースに追加とか削除をするときにはこのコマンドを使ってデータベース側に変更を加えますよ宣言をする必要がある。
具体的にはmigrateファイルの`change`メソッドを実行するためのコマンド。

### データベースの初期化
```
rake db:migrate:reset
```
このコマンドで全レコード削除からのテーブルを再構築
```
rake db:seed
```
このコマンドで`seeds.rb`に書いてあるコードを実行

### すでにあるテーブルにカラムを追加するコマンド
migrateファイルの作成をする。
```:コマンドプロンプト
rails g migration migrateファイル名
```

作成したファイルのchangeメソッドに追加カラムの情報を入れる
```ruby:作成したmigrateファイル
def change
    add_column :テーブル名, :追加するカラム名, :追加するデータ型
end
```
最後に変更を反映（changeメソッドを実行）
```:コマンドプロンプト
rails db:migrate
```

### マイグレーションって何


## Controllerの作成方法
`Controller`の作成には以下のコマンドを使う。
```:コマンドプロンプト
rails g controller コントローラー名
```
実行すると`app/controllers`フォルダに指定したコントローラー名のファイルが生成される。`コントローラー名_controller.rb`っていうフォルダ名になっているはず。
`コントローラー名`は**複数形の単語が好ましい**

## Modelの作成方法
ここではModelを作成していく。イメージ的にはデータベースが一つのエクセルファイルだとして、ここはシートを作成する感じ。
モデル名には単数形の単語にするのが命名規則。
**頭文字は大文字**
```:コマンドプロンプト
rails g model model名 カラム名:データ型 カラム名:データ型 カラム名:データ型...
```

作成したら以下のコマンドでデータベースに変更反映
```:コマンドプロンプト
rails db:migrate
```

model名がいわゆるシート名みたいな感じ。カラム名は列名を指定している。データ型は入れるデータの形を指定する。
- string : 文字列(1~255文字)
- text : 長い文字列(256~4294967296文字)
- integer : 整数(4バイト)
- bigint : 整数(8バイト)
- float : 浮動小数
- decimal : 精度の高い小数
- datetime : 日時
- timestamp : タイムスタンプ
- time : 時間
- date : 日付
- binary : バイナリデータ
- boolean : Boolean


## Viewの作成方法
コントローラーを作成すると`app/views`の中に指定したコントローラー名のフォルダが作成されるので、このフォルダにファイルを追加していく。ファイルの拡張子は`.html.erb`という少し特殊なやつ。Ruby対応HTML的な感じ。
ファイル名はコントローラーで指定するアクションと同じ名前にすること。そうすることでアクションを実行したら同じ名前コントローラー名のフォルダの中の指定したアクションと同じ名前のViewのファイルが表示される。
`Flask`でいう`render_template`が実行されるイメージ。

```html
<%= これで囲むとHTMLに表示されるRubyを埋め込むことができる %>
<% これで囲むとHTMLに表示されずにRubyを埋め込むことができる %>
```

## ルーティングの書き方
`config/routes.rb`のファイルでルーティングを決めていく。
書き方はこんな感じ。
```ruby:routes.rb
HTTPメソッド　'URL' => 'controller名#action名'
```
HTTPメソッドには`get``post``patch``delete`が入る。
URLの部分はルーティングの部分。
`Flask`でいう`@app.route('/')`の部分。
**ルーティングは上から探索されるので順番には注意すること。**
**:idのような変数を扱うルーティングは最後に書くこと。**

## Controllerでの操作
```ruby:controller
class controller名Controller < ApplicationController
    def index
    end
end
```
こんな感じで関数みたいにして書いていく。これは`Flask`と似ている。
ただ`Flask`みたいに`render_template`しなくても関数と同じ名前のViewファイルに画面遷移してくれる。賢い。

#### action内での変数定義の違い
action内での変数定義には二つやり方がある。
```ruby
@変数名
変数名
```
`@`が先頭につく変数はViewで使うことができる。
`@`がつかない変数はViewで使うことはできない。そのアクション内でのみ使用可能。

### params
`params`はpostされた情報、あるいはURL内の変数の情報が入っている。
`params`内の変数を指定することで特定の情報を取り出せる。
```ruby:
params[:変数名]
```
### session
ログインしたときなどにユーザー情報を保持するための変数。
この場合データベースに保存されず、ブラウザ側に保存されログイン中は情報と一緒にこのセッション情報もブラウザから送られる。
```ruby
session[:キー名] = 値
```
ログアウトするときにはこのセッションを破棄する（空にする）ことで実現できる。
```ruby
session[:キー名] = nil
```
セッションの値を`nil`にすることで値を空にすることができる。

### application_controller
これはすべてのコントローラーに共通する処理をまとめることができる。
#### before_action
これはアクションを行う前に実行されるアクション
```ruby
before_action: 関数名
def 関数名
    処理
end
```
こうすることでアクションが実行される前に指定した関数名のアクションを実行することができる。

## Viewでの操作
### link_to
`.html.erb`ファイル内に
```html
<%= link_to '表示したい文字' controller名_action名_path%>
```
と指定することで。controller名の指定したaction名が実行される。
`Python`でいう`url_for`で関数名を指定するイメージ。
`link_to`の部分はコンパイルされたとき実際のView上ではaタグとして生成される。
またこの時のHTTP通信は`GET`のみ対応している。そのため`POST`に対応させるためには以下のように設定する。
```html
<%= link_to '表示したい文字' controller名_action名_path, {method:'post'}%>
```

## form_for
View上で入力フォームを作るときに用いる。ユーザーが入力した値を変数にまとめてコントローラーに送る。
この時送り先は指定しなくても勝手に`create`というアクションに飛ぶようになっている。すでに情報を持っている場合は`update`というアクションに飛ぶ。

```html
<%= form_for @変数名 fo |f| %>
<!-- form内容 -->
<% end %>
```

`form_for`を使うときはコントローラー側で以下のように変数を設定する。
```ruby
def new
    @変数名 = モデル名.new
```
これでデータベースに登録するためのレコードを新規で作って変数に代入している。

### form内容の種類
https://www.sejuku.net/blog/13163

### #{式・変数}
これを使うことで変数や式を展開し一つの値に戻すことができる。

### redirect_to
このコマンドで既存のViewに対応したURLを指定することで指定したViewにリダイレクトすることができる。
```ruby:
def index
    redirect_to('指定のURL')
end
```


## Modelでの操作
### validate
これを指定することで追加するデータの制限を加えることができる。
```ruby
validate :カラム名, {presence:true}
```
これは空のデータを受け付けない設定。
```ruby
validate :カラム名, {length,{maximum:140}}
```
これは文字数の最大を140とする設定