Ruby on Rails初心者の学習記録

##本記事の趣旨
本記事は、普段メインでJavaを使っているwebエンジニアの、
Ruby(Ruby on Rails)お勉強記録です。
高度な内容ではない点やお作法的にもよろしくない部分がある点につきましては、あらかじめご了承ください🙇

業務のかたわら週1回1時間程度、ゆるりと進めています。

##第0回 準備
- MacにHomebrewをインストール

ターミナルで下記シェルを実行。
https://brew.sh/index_ja

##第1回 Hello World

```
$ sudo gem i rails
```
```
$ rails new 【プロジェクト名】
```

作成したプロジェクト内にcdして下記コマンドでサーバを起動します。

```
$ rails s
```

webブラウザで
localhost:3000
を叩いて、下記画面が表示されれば成功。ここまで爆速。
<img width="921" alt="スクリーンショット 2019-07-29 18.24.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/0db03b88-d8ad-2096-9b06-199207db5283.png">

- gemとは、Rubyのパッケージ管理。
https://blog.codecamp.jp/rails-gem

- bundlerとは、gem同士の依存関係を保ちながらパッケージ管理をしてくれる。bundler自体もgemである。
https://qiita.com/io_fleming/items/14626a9cff44bc87e7db

`$ gem install bundler`
でインストール。

- rbenvとは、Rubyのバージョン管理。

`$ brew install rbenv`
でインストール(詳細は第6回)。

##第2回 ディレクトリ構成
雑にまとめると、

- app配下にController
- jobs 非同期処理でレスポンスを返さない、やりっぱなしの処理
- models modelに紐づくロジックはすべてそのクラス内に書く(※modelの設計は慎重にやる必要があるらしい（MDD、TDD、DDD))
- db配下のseeds.rbは初期データ
- config配下は諸々の設定で、設定対象によってファイルが別れている
-- cable.yml
-- database.yml
-- puma.rb → アプリケーションサーバ的な設定？

スキマ時間でドットインストールで学習しても良いかも知れない
https://dotinstall.com/lessons/basic_rails_v3

##第3回 Controllerを作成してみよう
コマンドラインからクラスの作成を行う。
この辺はあまりJavaではなかったやり方。

```
$ rails generate controller 【コントローラ名】 【アクション名】
```

今回は
 
```
$ rails generate controller users index
```

アクション名をつけてコマンドを叩くと、対応するviewが作られます。viewsディレクトリ配下にいるはず。

Contoller→Javaでも同義
アクション名→Javaでいうメソッド

サーバを起動して、

```
localhost:3000/users/index
```

を叩くと、先程作成したアクションが実行され、viewが表示されます。
返却するview名を明示しない場合、自動的にアクション名と同じ名称のviewが選ばれるようです。

##第4回 ViewからContollerに渡した値を永続化してみよう

- ViewからControllerに値を飛ばす
https://qiita.com/shunsuke227ono/items/7accec12eef6d89b0aa9

第３回で表示してみたviewを編集していきます。
textboxとsubmitボタンを追記します。

```erb:views/index.html.erb
<%= form_tag("/users/create", method: "post") do %>
    <input type="text" name="hoge" value="piyo" />
    <%= submit_tag("作成！") %>
<% end %>
```

エンドポイントのマッピングを書いていきます。

```rb:config/routes.rb
Rails.application.routes.draw do
  get 'users/index'
  post 'users/create' #この行を追加
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

```

- modelを作成

```
$ rails g model モデル名 [メンバ名]:String
```

migrateするとsqliteに自動でtableを作ってくれます。

```
$ rails db:migrate
```

ControllerでviewからPOSTされた値を受け取って保存するコードをusers_controllerに記述します。

```rb:controllers/users_controller.rb
class UsersController < ApplicationController
  def index
  end
  #下記のdef〜endを追記
  def create
  #hogeはviewに書いたPOSTされてくる要素
  【model名】.create(【メンバ名】:params[:hoge])
  p 【model名】.all
  end
end
```

index.html.erbのsubmitボタンを押下すると、先程作成したPOSTメソッドが実行されDBに値が保存されます。
sqliteの中身を実際に確認してみましょう。
db配下にdevelopment.sqlite3がいるはずなので、dbまでcdし、

```
$ sqlite3 development.sqlite3
```

```
sqlite3> select * from テーブル名 
```

POSTした値がDBに登録されているはずです。
![スクリーンショット 2019-08-16 10.09.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/02be2a63-32fa-42f9-5f63-4230e326d560.png)

##第5回 scaffoldでCRUDを自動生成
```
$  rails g scaffold モデル名 カラム名:型
```

いろいろつくられます。

<img width="428" alt="スクリーンショット 2019-08-22 18.27.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/d62d237a-8622-9b76-332c-5f3280e0c200.png">

`$ rails db:migrate`
でマイグレーションし、
 `$rails s`
で起動し、
`localhost:3000/doramis`
にアクセスし、いろいろいじってみると、

- 一覧表示
- 登録
- 更新
- 削除

が一通りできる。マスタメンテ画面ならこれで十分。
DBの中身は前回もやったようにsqlite3コマンドで確認可能。

```ruby
<%= link_to 'New Dorami', new_dorami_path %>
```
####今日の感想
link_to が初見だとカオス。

##第6回 Rails6にアップデート
####参考
https://qiita.com/rry/items/12d794437cde733f8ece
https://qiita.com/NaokiIshimura/items/8203f74f8dfd5f6b87a0

Rubyのバージョンが古かったので、
rbenvのバージョンを2.6.4をインストール、切り替えして作業しました。

`$ rbenv install 2.6.4`
`$ rbenv local 2.6.4`
`$ ruby -v`
`$ sudo gem i rails -v "6.0.0"`
`$ rails new 【プロジェクト名】`
`$ rails s`

バージョンがうまく切り替わらなかったので、
.bash_profileに
`eval "$(rbenv init -)"`
を追加。

####おまけ rails console
https://qiita.com/you8/items/00d97f871f5fa78905f7
Modelを作成してrails consoleでデータを保存してみる、などをしてみました。

##第7回 BootStrapを入れてみる

Gemfileに下記を追加
`gem 'bootstrap', '~> 4.２.1'`

プロジェクト配下で
`$ bundle install`

/app/assets/stylesheets/application.css
をapplication.scssにリネームし、
`@import "bootstrap";`
を追記。

適当なerbファイルに下記を追加。

```erb:index.html.erb
<button class="btn btn-info" type="submit">BootStrap読み込めてるかな</button>
```

反映されてたら成功！
<img width="403" alt="スクリーンショット 2019-09-05 18.42.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262530/05d86d2a-e08b-e3eb-f444-63480d3dc49b.png">

##感想
プロフダクションコードを書けるようになるにはもう少し時間をとって学習しないとな、と思いました。

今後もゆるりと進めていく予定です・・・

##第8回 APIモード
プロジェクト作成時に`--api`をつけるとviewに関係する部分の作成がされなくなります。

```
rails new sample-api --api
```