【さちゃでもわかる】Ruby on Rails 入門1

## はじめに
1年くらい前にProgateでRubyを少しだけ触っていた自分が，バイトで1ヶ月バリバリのRubyの環境で(知らなかった)学んだ話の備忘録．

## 実装環境
macOS Catalina 10.15.4
ruby 2.6.3
Rails 6.0.2.1

## 参考リンク
[Railsガイド](https://railsguides.jp/getting_started.html)

## Railsとは？
[Railsガイド](https://railsguides.jp/getting_started.html)を軽くまとめると

- Rubyプログラミング言語で書かれたWebアプリケーションフレームワーク
- Railsは、最善の開発方法というものを1つに定めており，それに沿った開発を全面的に支援する
- コード量がより少なくて済むにもかかわらず、より多くの機能を実現できる

というものです．そしてRailsの哲学には

#### 同じことを繰り返すな (Don't Repeat Yourself: DRY): 
> DRYはソフトウェア開発上の原則であり、「システムを構成する知識のあらゆる部品は、常に単一であり、明確であり、信頼できる形で表現されていなければならない」というものです。同じコードを繰り返し書くことを徹底的に避けることで、コードが保守しやすくなり、容易に拡張できるようになり、そして何よりバグを減らすことができます。

#### 設定より規約が優先される (Convention Over Configuration): 
> 
Railsでは、Webアプリケーションで行われるさまざまなことを実現するための最善の方法を明確に思い描いており、Webアプリケーションの各種設定についても従来の経験や慣習を元に、それらのデフォルト値を定めています。このようにある種独断でデフォルト値が決まっているおかげで、開発者の意見をすべて取り入れようとした自由過ぎるWebアプリケーションのように、開発者が延々と設定ファイルを設定して回らずに済みます。

というものがある．

## セットアップ

#### Rubyのインストール
既存でインストールしている場合もあるので確認してみましょう．

```
$ ruby -v
```
以下のような表示があればインストールされています．

```
ruby 2.5.0
```
大体のmacユーザー(Homebrew)は以下のコマンドでインストールができます．

``` 
$ brew install ruby
```

それ以外の方や，わからない方は以下の参考リンクから調べてみてください．

参考：[Rubyのインストール](https://www.ruby-lang.org/ja/documentation/installation/)

※Windowsで作業する場合は、[Ruby Installer Development Kit](https://rubyinstaller.org/downloads/)もインストールすべきだそうです．また，SQLite3データベースのインストールも必要です。

```
$ sqlite3 --version
```

これでRubyのインストールはできたと思います．続いてRailsのインストールをしていきます．


#### Railsのインストール
Railsをインストールするには、gem installコマンドを実行します．以下のコマンドで実行可能です．

```
$ gem install rails
```
正常にインストールできたか確認するために以下のコマンドを実行しましょう

```
$ rails --version
```

## 実際にプロジェクトを作成してみる
[Railsガイド](https://railsguides.jp/getting_started.html#%E3%83%96%E3%83%AD%E3%82%B0%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)にしたがってアプリケーションを作成していきましょう．
詳細はリンクから確認して，実際に試してみてください．
以下では自分が気になったことや，つまりそうなポイントを説明していきます．

## Railsの基本要素(MVC)
アプリケーションを作成する上で基盤となる3つの要素についておさらいします．
3つの要素は，
`Model` : データ周り，データベースとのやり取り
`View` : 見た目(UI)，ユーザーの見える部分を管理
`Controller` : ModelとViewのやりとり，ユーザーからのリクエストを受け取り、モデルとビューに役割分担する

参考：[RailsにおけるMVC(モデル/ビュー/コントローラ)](https://www.javadrive.jp/rails/ini/index7.html)
参考：[RubyOnRailsにおけるMVCの流れ](https://qiita.com/right1121/items/b54f660603b7fa61a469)

Controllerを介して，Viewの表示が決められます．
したがって，ControllerとViewは最低限必要で，Modelはなくても表示を行うことが可能です．

## ルーティング
ルーティングとは，簡単にいうと__URLの割り振り__です．
[他のQiita](https://qiita.com/akk11_k/items/a6a21beb2b736ebbc147)では以下のように紹介されています．

> 
Railsアプリケーションのコントローラへ指示を出すための道筋

`config`配下にある`routes.rb`に記述することで設定が可能です．
ルーティング時に覚えておきたいことは主に3つあります．

- `resources`という概念
- 1つのコントローラに対して複数のルーティングがあるのはよくあること
- Controllerは複数形で，Modelは単数形で定義する
- 各コントローラに対してアクションを定義する
- __root__：アクセスして一番最初のコントローラへの指示

以下に詳しい説明をしていきたいと思います．

## Resourcesとは
Resourcesの前にまずRESTという概念を理解する必要があります．

#### RESTとは
[他のQiita](https://qiita.com/Atsushi_/items/bb22ce67d14ba1abafc5)では以下のように紹介されています．

> 
REST(REpresentational State Transfer)の略称で、Webサービスの設計モデルです。RESTなWebサービスは、そのサービスのURIにHTTPメソッドでアクセスすることでデータの送受信を円滑に行います。

また[別の他のQiita](https://qiita.com/kidach1/items/43e53811c12351915278)では以下のように紹介されています．

> 
RESTとは、アプリケーションを構成するコンポーネント（Userなど）を、
・RDBMSのCRUD（Create/Read/Update/Delete）
・HTTPRequestの各メソッド（GET/POST/PUT/DELETE）
に対応させて、自由に作成/読み出し/更新/削除できるもの（リソース）として扱うアーキテクチャ。

本題の`resources`についてですが，`resources`はRailsで基本となる7つのアクションへのルーティングを定義する際に用います．
実際の例をみてみましょう．

``` routes.rb
Rails.application.routes.draw do
  resources :コントローラー名
  resources :コントローラー名, only: [:アクション名, :アクション名, ...]
  resources :コントローラー名, except: [:アクション名, :アクション名, ...]
end
```
`resources`を使えば基本アクションの7つ(`index/new/show/create/edit/update/delete`)を一括に定義できます．
また，`only`や`except`を使って指定したアクションだけを指定することもできます．
`resources`の仕組みがRESTの考え方に一致したものとなっています．

## Controllerについて
先ほども述べましたが，Controllerは複数形でファイルを作成します．
以下のコマンドでターミナルなどからも簡単に作成できます．

```
$ rails generate controller Hoges
```

コントローラでは，アクションの定義を行ったり，必要なデータの取得や変数の定義を行います．
簡単な例を見てみましょう．

``` ruby
class HogesController < ApplicationController
  def show
    @インスタンス変数 = ...
  end
 
  def new
  end
end
```
上記の例だとViewは以下のようなディレクトリ構成になります．

``` 
Views
  ┗ Hoges
    ┗ show.html.erb
    ┗ new.html.erb
```
(余談ですが，ここの`erb`とはERB言語を表しており，HTMLにRubyを埋め込むよう設計されています．)
`routes.rb`で以下のようにルーティングがされていれば

``` routes.rb
Rails.application.routes.draw do
  // hogesのルーティング
  resources :hoges
end
```

ローカルサーバー(http://localhost:3000/hoges/show or http://localhost:3000/hoges/new)で動作が確認できるはずです．

## Modelについて
Railsのモデルは，単数形の名前を持ち，対応するデータベーステーブル名は複数形で表されるというルールがあります．
コントローラ同様，以下のコマンドでターミナルなどからも簡単に作成できます．

```
$ rails generate model Hoge [カラム名]:[データ型] [カラム名]:[データ型]
```
モデルではデータベースとのやり取りを行うので，データベース用のテーブル作成が必要であり，コマンドの後半がそれにあたります．
データベースへの追加，更新をするのが__マイグレーション__です．

モデルにまつわる参考記事を以下に置いておきます．

参考：[Railsのmodelを徹底解説！知っておくべき3つの知識も紹介](https://udemy.benesse.co.jp/development/web/rails-model.html)

## マイグレーションとは
`rails generate model`を実行すると、データベースマイグレーションファイルが`db/migrate`の配下に作成されます．
マイグレーションを実行するには以下のコマンドを実行する必要があります．

```
$ rails db:migrate
```

Railsをやっていると，よく以下のようなエラーに出くわします．

```
bin/rails db:migrate RAILS_ENV=development

Error:[rake --tasks] rake aborted!
Gem::LoadError: You have already activated rake 12.0.0, but your Gemfile requires rake 13.0.1. Prepending `bundle exec` to your command may solve this.
　　　　・
　　　　・
　　　　・
```
これは，マイグレーションができておらず，データの不整合がある時に出るエラーのようで，マイグレーションを実行することでエラーを取り除くことができます．

## ViewとLayoutの概念
Viewは静的で問題なければ，`HTML/CSS`がかければ問題ない気もします．
ただ，データのやりとりなど動的な仕組みが必要であれば，`ruby`をうまく使って書くほかありません．
この時，よく利用するのが`render`というメソッドです．
`render`については以下の記事が参考になると思います．

参考：[忘れがちなrenderメソッドの使い方まとめ [Rails]](https://qiita.com/hayashino/items/c2a4e7d3edbdcce3cd2a)

`HTML`のなかに`ruby`を記述する際は

``` index.html.erb
<%= 〜 %>
<% ～ %>
```
が基本となります．詳しくは以下の記事が参考になると思います．

参考：[テンプレートの中でRubyコードを使う](https://www.javadrive.jp/rails/template/index5.html)

また，`layout`という概念があり，とても便利になっています．
コントローラ内でlayoutを指定することで，Viewの基盤を作成することができます．
簡単な例を見てみましょう．

``` hoges_controller.rb
class コントローラ名 < ApplicationController
  layout 'レイアウトファイル名'

  def アクション名
  end
end
```
指定する`layout`の定義は`app/views/layouts/任意の名前.html.erb`でレイアウトを用意し、コントローラ毎にどのレイアウトを使用するのかを指定することができます．

こちらも詳しくは以下の記事が参考になると思うのでよかったら見てみてください．

参考：[コントローラやアクション毎に使用するレイアウトを切り替える](https://www.javadrive.jp/rails/template/index3.html)

## 個人的にRubyでつまづいたところ
- web開発ならではのルーティング処理(ファイル名の命名規則とディレクトリ構成で勝手に決まっているのが理解できなかった)
- 変数の定義と宣言が一律(C#のように宣言と定義とかが明言されていない気がして困惑した)
- synbolという概念(別記事で書きたいが変更不可能な1つのオブジェクト)([参考リンク](https://qiita.com/Kta-M/items/53a13ef60e14fcb41193))

## おわりに
最後まで見てくだりありがとうございます．
本当はまだまだ書き足りないのですが，1つの記事にしては長くなりすぎている気がするので続きは別記事に書きたいと思います．
振り返ってみると`Ruby`ってめっちゃ理にかなっているものだなと思いました．
最近Nuxt/Vue.jsでの短期開発もしたので今度比較した記事も書いてみたいと思います．

## 参考になりそうなリンク集(別記事で紹介したい記事一覧)
- [Railsバリデーションまとめ](https://qiita.com/h1kita/items/772b81a1cc066e67930e)
- [[Rails初心者必見]Rails あるあるのエラーを解説](https://qiita.com/gonzaemon111/items/a6d9f3ad0645037125c2)
- [パラメータの取得](https://www.javadrive.jp/rails/controller/index6.html)
- [RubyのModuleの使い方とはいったい](https://qiita.com/shiopon01/items/fd6803f792398c5219cd)
- [【まとめ】インスタンス変数、クラス変数、クラスインスタンス変数](https://qiita.com/mogulla3/items/cd4d6e188c34c6819709)
- [【Rails】form_for/form_tagの違い・使い分けをまとめた](https://qiita.com/shunsuke227ono/items/7accec12eef6d89b0aa9)
- [Railsガイド(次はここから)](https://railsguides.jp/getting_started.html#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B)