cloud9でのrails環境構築と入門的内容

# 個人的リマインド用
参考
[はじめてのRuby on Rails入門-RubyとRailsを基礎から学びウェブアプリケーションをネットに公開しよう](https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/)

## 環境構築
**Rubyバージョン管理**
クラウド9ではrbenvではなくRVMを使う
```
rvm -v バージョン確認
rvm list 使えるRubyバージョンの確認
rvm get stable rvmをアップグレード
rvm install ruby-[指定バージョン] rubyをバージョン指定でインストール
rvm use [指定バージョン] Rubyバージョン切り替え
rvm --default use 3.0.2 指定バージョンをデフォルトにする
```

**Rails環境構築**
基礎用語
・bundler→RubyGemsを管理するもの
・RubyGems→Rubyのパッケージ管理ソフト
```
rails -v railsのバージョン確認
gem -v gemのバージョン確認
gem install rails -v [指定バージョン] -N 
-v以降なしだと最新バージョンをインストール、-Nはドキュメントをインストールしないオプション
```

## Rails入門
Railsの超初歩

### Railsの基本理念
**設定より規約**
例えば、データベースのテーブル名はモデルの複数形にする(User→users)など
規約に乗ることで、よりサービスの本質的なとこに注力できるようになる

**DRY(Don't Repeat Yourselef)**
同じことを繰り返さない(重複したコードを1箇所にまとめる)

### MVCアーキテクチャ
**Model**
データベースアクセスなどデータ関連処理
**View**
画面表示
**Controller**
リクエストやレスポンスを制御
ViewとModelの橋渡し

役割ごとに分けてかくことで、プログラム全体の見通しがよくなり、メンテナンス性が高まる。

### Hello world出力まで
```
新規のRailsプロジェクトを作る
rails [_Railsバージョン_] new [プロジェクト名]
例:rails _7.0.0_ new hello バージョンは指定する場合のみ

サーバー立ち上げ
rails s(server) 
```
**サーバーを立ち上げても変な画面**
Railsではセキュリティ上の理由からホワイトリストに登録されていないホストでアクセスした場合に、ブロックされてしまう。
```
ホワイトリストをクリア
config → environments → development.rbの一番下に
config.hosts.clear てな感じで書くと大丈夫
```
**Controllerを作成**
Controllerを作るにはrails generateが必要
```
ディレクトリが現在のプロジェクトであることを確認
rails g controller [コントローラーにつける名前] [定義するメソッド、アクションの名前]
例：rails g controller users index

※コントローラーにつける名前は複数形にすることが普通だが、homeコントローラーとかinfoコントローラーとか
データベースと直接結びつかない場合は単数形にする場合もある
```
以上のコマンドでいろいろファイルができるが必要なところを見ていく
・app/controllers/users_controller.rb
(中を見てみるとUsersControllerはApplicationControllerを継承している)
コントローラーはアプリケーションに対する特定のリクエストを受け取って処理する役割がある

今回の場合indexメソッドがある。これはクライアントからのリクエストに対して具体的な処理を実行するためのメソッド。
```
上記メソッドの中にHello worldを出力する内容を書く
def index
  render plain: 'Hello world'
end

renderメソッドは、ブラウザで表示するコンテンツのレンダリングを行うメソッド
plainオプションを使用すると、平文のテキストをブラウザに表示できる
```
開いてるサーバーのURLを
~/users/indexにするとHello worldが表示される

**ルーティングの変更**
ルーティングとはURLとアクションを結びつける設定のこと
```
アクションとURLの対応を確認する
rails routes
```
routesを見てみると情報が4行ある
・Prefix→リンクを設置するときなどにパスを指定する時に使う
・Verb→GET,POST,DELETEなどのメソッド名が記載
・URI Pattern→アドレス
・Controller#Action→users#index(コントローラー名#アクションが実行されるということ)
```
config/routes.rbファイルに記述してルーティングを設定
Rails.application.routes.draw do
  get 'users/index' #userコントローラーのindexアクションを実行しろという意味
end

上記のものはrails gで自動的に記述される
また 
get 'users/index', to 'users#index'の省略形
'users', to 'users#index'にするとリンクが~/usersになる
```

### Viewの利用
現状はControllerにViewの機能を持たせている変な状態
```
app/views/users/index.html.erbができている
erbはHTML内にRubyを埋め込める(Rubyの標準ライブラリ)
```
**規約**
例：
app/views/users/index.html.erb
ルール：
app/views/コントローラー名/アクション名.html.erb
こういったのを勝手にやってくれる
```
erbにRubyの処理を埋め込む
<p><%= 10 + 1 %></p>
=をつけることで画面に表示される
```
**コントローラーからviewに渡す**
HTMLないでの計算は好ましくない
```
users_controllerにて
def index
  @num = 10 + 1
end

@numをviewで書く
```
### modelの作成
例題→ユーザーを管理するUserモデルを作成(nameとageを持つ)
```
modelの作成
rails g model [モデル名] [データ構造]
例： rails g model User name:string age:integer

※model名は単数形

・db/migrate/(timestamp)~~~
これはマイグレイションファイルと呼ばれるもの

・models/user.rb
モデルクラスを定義するファイル
```
```
migrationの実行
rails db:migrate
```
**データベース構造の確認**
```
rails console
データベースをコマンドで操作できるモードに(標準はsqlite)←画面が変な感じ
困った時は.quitで抜けよう

.tables テーブルの確認、左2つはRubyの標準のもの
.schema users 構造確認
```
**データベースの操作**
```
rails c(console)

User.all ← SELECT * FROM 'users'

データの挿入方法
user = User.new インスタンスの作成
user.name = '~~'
user.age = ~~
user.save 最後に保存を忘れずに
1行ですませる
lucas = User.new(name: 'Lucas', age: 24)
lucas.save

idを指定してデータを取得
User.find(id)

値のupdate
yamada = User.find(id) 変数に保存
yamada.name = '~~'
yamada.age = ~~
yamada.save

削除
yamada = User.find(id) 変数に保存
yamada.destroy
1行ですませる
User.find(1).destroy
```

**データベースの値をWebページに表示**
```
uesrs.controllerにて
def index
  @users = User.all インスタンス変数に保存
end
```
```
現在3つのデータが入っているとする
eachで取り出す

<ul>
  <% @users.each do |user| %>
    <li>
      <%= user.id %>, <%= user.name %>, <%= user.age %>
    </li>
  <% end %>
</ul>
```