Ruby on Railsについて（基礎/コマンド）

# 最初に
自身で学習してきた内容を書き出していきます。
基本的には自分自身でわかるような内容になりますので、ご容赦ください。
また、誤っている点がありましたら、コメントにてご指摘ください。

（要確認）マークがあるものは、「実行前に必ずググる」べき内容。



# Subline Text
下記はSubline Textを使用した開発を前提に進めます。
また、自分自身でも理解しやすいように、拡張子は基本的にHTMLにしています。



# index
- アップデートエラー
- 新規アプリケーション作成
- controller
- (view)
- ルーティング
- model



# アップデートエラー
Ruby on Railsのアップデートによる可能性が高いエラー

```terminal:
Errno::EPERM: Operation not permitted @ chown_internal -
/tmp/bundler2018mmdd-27024-qf4sfs/bin
An error occurred while installing [gem名] (x.x.x), and
Bundler cannot continue.
Make sure that `gem install [gem名] -v 'x.x.x' --source
'https://rubygems.org/'` succeeds before bundling.
```



# Railsサーバー立ち上げ

```terminal:
$ rails s -b 0.0.0.0 # $ rails server -b 0.0.0.0の短縮記述
```

http://localhost:3000 で確認しよう

**control + c** でサーバーを停止
control + zを打ってしまったら（実行中のプログラムを一時停止してしまったら）

```terminal:
$ lsof -wni tcp:3000

$ # 結果
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby2.5 xxxxx vagrant   16u  IPv4 109558      0t0  TCP *:3000 (LISTEN)

$ kill -9 xxxxx # PIDの数字をxxxxxに代入
```



# 新規アプリケーション作成

```terminal:
$ rails new アプリケーション名 # アプリケーションの作成

$ rm -rf アプリケーション名 # アプリケーションの削除
```



# controller(app/controllers/コントローラー名sController.rb)
**コントローラの命名規則**

| 種類 | 概要 | 概要 |
|:-----------------|:------------------|:------------------|
| コントローラ名 | 複数形、先頭は英小文字 | homes |
| コントローラのクラス名 | 複数形、先頭は英大文字 | HomesController |
| ファイル名 | 複数形、先頭は英小文字 | homes_controller.rb |


```terminal:
$ rails g controller コントローラ名s index show new edit # viewを使うアクションをまとめて作成

$ rails g controller コントローラ名s # コントローラ名sを作成
$ rails d controller コントローラ名s # コントローラ名sを削除
```

g(generate)は、コントローラやアクションをまとめて自動設定できる便利なコマンド。
上記のまとめて作成した例だと、下記が同時に作成される。

- コントローラー名sコントローラ　　　　
- indexアクション
- showアクション
- newアクション
- editアクション
- コントローラー名s/index.html.erbファイル
- コントローラー名s/show.html.erbファイル
- コントローラー名s/new.html.erbファイル
- コントローラー名s/edit.html.erbファイル



##### view(app/views/コントローラー名s/view名.html.rbなど)
command + n で新規ファイルを作成
命名は、コントローラーで指定したアクション名でOK

indexアクションの場合
index.html.erb



# ルーティング(config/routes.rb)
indexからdestroyまでの7つのアクションのことを、RESTfulなURLと呼ぶ。
RESTfulとは、REST（REpresentational State Transfer）の設計思想に基づいたシステムのこと。
Railsではresourcesメソッドを利用すると自動で設定してくれる優れもの。

```ruby:config/routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html

  get 'hoges/index' # 基本記述の一例

  resources :コントローラー名s # index,show,new,create,edit,update,destroyの７種類が全て詰まってる
  resources :コントローラー名s , only: [:index, :show] # 指定する場合
  resource :コントローラー名s # 単数にすると、そのコントローラのidがリクエストに含まれなくなる

  root to: "コントローラー名s#アクション名" # /に設定（初期ページ）

  get '/hoge/about' => 'hoges#show', as: :about # ルートパス名を指定したい場合
end
```

resourcesとresourceの使い分けに注意。

### ネスト
また、**ネスト**することもできる。（親子関係）
例として、「ある投稿画像に関連付けられたコメント」と認識できるURLを作る時。

```ruby:config/routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

  resources :hoge_images, only: [:new, :create, :index, :show] do
      resource :hoge_comments, only: [:create]
  end

end
```

```terminal:
hoge_image_hoge_comments POST   /hoge_images/:hoge_image_id/hoge_comments(.:format) hoge_comments#create
```

## ルーティングの確認

```terminal:
$ rails routes                                                                       
```



# model

```terminal:
$ rails g model モデル名 カラム名1:データ型1 カラム名2:データ型2 ... #モデルとテーブルを同時作成

$ #例
$ rails g model Hoge title:string category:string body:text　

$ rails g model モデル名 # モデルを作成
```

### マイグレーションをデータベースに反映する

```terminal:
$ rails db:migrate
```

**オプションの追加などは、マイグレーションファイルを用途ごとに作成し、データベースに反映する必要がある**


##### カラムの追加

```terminal:
$ rails generate migration remove_カラム名_to_テーブル名 カラム名

$ # 例
$ rails generate migration remove_hoge_to_huga hoge

$ rails db:migrate # 変更を反映
```

##### カラムの削除

```terminal:
$ rails generate migration remove_カラム名_to_テーブル名 カラム名

$ # 例
$ rails generate migration remove_hoge_to_huga hoge

$ rails db:migrate # 変更を反映
```


##### カラムのデータ型変更

```terminal:
$ rails generate migration change_カラム名_to_テーブル名
$ # 例
$ rails generate migration change_hoge_to_huga
```

```ruby:マイグレーションファイルの作成日時_change_column_to_Huga.rb
class ChangeColumnToHuga < ActiveRecord::Migration
  #変更後の型
  def up
    change_column :Hugas, :hoge, :integer, null: false, default: 0
  end

  #変更前の型
  def down
    change_column :Hugas, :hoge, :intger, null: true
  end
end
```

```terminal:
$ rails db:migrate # 変更を反映
```

# 追加あれば、どんどん更新していきます。
駆け出しとして頑張ります。