progateで習得したRailsの基礎知識まとめ

## どんな人向けの記事か
- Railsを学び始めて間もない人
- Railsで初めてアプリを作ろうとしている人
- Rails慣れはしているけど少し復習したい人

## どんな記事か
Rails初学者である筆者が、先日修了したprogateのRailsコースで学んだことを並べていく記事です。
ところどころ他記事の情報で補完しているため、progate運営が表現・説明した内容とは異なる箇所もそれなりにあります。

## 各種概念
#### サーバー
クライアント（ブラウザ）の要求に応じてデータを提供するコンピュータ。
Railsで作ったアプリをブラウザで表示するためには、このサーバーを起動させる必要がある。

#### ビュー
ページの見た目を作るためのHTMLファイル。ブラウザとRailsのやりとりの中で、Railsからビューが返されることで、ページが表示される。
拡張子は`.html.erb`。erbはEmbedded Rubyの略で、HTMLファイルにRubyスクリプトを埋め込むための仕組み。
下記のコントローラ・ルーティングと同様に、ページを作成するのに必要な3つの要素のうちの1つ。

#### コントローラ
ブラウザにビューを返すためのもの。コントローラは目的に合わせてそれぞれ作成される。
例えば投稿に関する機能とユーザーに関する機能はそれぞれ別のコントローラファイルで規定される。

#### アクション
コントローラ内の、ブラウザに返すビューを見つけ出すための機能。コントローラファイル内でメソッドとして表現される。

#### ルーティング
送信されたURLに対して、「どのコントローラ」の「どのアクション」で処理するかを決める、対応表のようなもの。

#### データベース
データを保存しておくための場所。

#### テーブル
データベース内でデータを管理している表。行ごとのデータをレコード、列ごとのデータをカラムと呼ぶ。

#### モデル
データベースとのやりとりを行うクラス。モデルのインスタンスを作り、それを保存する工程を経ることでデータをテーブルに格納できる。

#### マイグレーションファイル
データベースに変更を指示するためのファイル。



## コーディング
###ビューファイルで使うコード
####<% %>
```html
ex)<%= @post %>
```
HTMLファイルにRubyコードを埋め込む際に、コードの前後に表記する。コードをブラウザに表示させたい場合は、コードの前後に`<%= %>`と表記する。

####link_toメソッド
```html
<%= link_to("表示する文字", "URL") %>
ex) <%= link_to("投稿一覧", "/posts/index")%>
```
リンクを作成する。HTMLファイルで使う。
第3引数に{method: "post"}を追加することで、postとして定義されているルーティングにマッチするようになる。

####form_tag
```html
<%= form_tag("URL") do %>
　データ
<% end %>

ex)
<%= form_tag("/posts/update") do %>
　<textarea name="content"><%= @post.content %><textarea>
  <input type="submit" value="投稿">
<% end %>
```
フォームに入力されたデータを、指定したURLに送信することができる。
しかしform_tag単体では意味がなく、textareaタグ（またはinputタグ）にname属性を指定することにより、name属性をキーとしたハッシュをアクション側に伝えることができる。
余談だが、上記のようにtextareaタグの間に値を置いておくことで、フォームを再入力する際にもともと入力していた内容の続きから入力できたりする。

####errors.full_messages
```html
<% インスタンス名.errors.full_messages.each do |message| %>
  <%= message %>
<% end %>

ex)
<% @posts.errors.full_messages.each do |message| %>
  <%= message %>
<% end %>
```
エラーメッセージを出力する。saveメソッドを呼び出した際にバリデーションに失敗すると、Railsでは自動的にエラーメッセージが生成されるようになっているため、each文を用いることですべて表示することができる。

####yield
```html:views/layout/application.html.erb
<%= yield %>
```
各ビューファイルは、application.html.erb内に表記されたyieldに代入される。
application.html.erbはサイト全体に適用するレイアウトを記載するビューファイル。

###コントローラファイルで使うコード
####@変数
```ruby
@post = "hogehoge"
```
コントローラファイルで定義をすると、ビューファイルでRubyコードの埋め込みをする際に利用できるようになる。

####newメソッド
```ruby
モデル名.new(カラム名: 値)
ex) post = Post.new(content: "hogehoge")
```
モデルからインスタンスを作成する。

####saveメソッド
```ruby
インスタンス名.save
ex) post.save
```
作成したインスタンスをテーブルに保存する。

####allメソッド
```ruby
モデル名.all
ex) posts = Post.all
```
テーブル内の全てのレコードを取得する。

####find_byメソッド
```ruby
モデル名.find_by(カラム名: 値)
ex) post = Post.find_by(id: 1)
```
ある条件に合致するデータを1つ取得する。

####whereメソッド
```ruby
モデル名.where(カラム名: 値)
ex) posts = Post.where(id: 1)
```
ある条件に合致する複数のデータを取得する。

####redirect_toメソッド
```ruby
redirect_to("URL")
ex) redirect_to("/posts/index")
```
指定したページに転送することができる。

####renderメソッド
```ruby
render("フォルダ名/ファイル名")
ex) render("posts/edit")
```
別のアクションを経由せずに、直接ビューを表示することができる。
データの保存に失敗したときなどによく使われる。

####orderメソッド
```ruby
モデル名.order(カラム名: :並び替えの順序)
ex) @posts = Post.all.order(created_at: :desc) 
```
取得したデータの並び替えを行う。:desc は降順、:asc は昇順を表す。

####destroyメソッド
```ruby
インスタンス名.destroy
ex) post.destroy
```
指定したデータ（インスタンス）をデータベースから削除する。

####変数session
```ruby
session[:キー名] = 値
ex) session[:user_id] = @user.id
```
ページを移動してもログインユーザーの情報を保持し続けるためのもの。
nilを代入するとログイン状態ではないようにすることができる。

####params
```ruby
ex1) @id = params[:id]
ex2) @post = Post.new(content: params[:content])
```
用例1. ルーティングで設定したURLの :○○ の値を取得する。
用例2. name="○○"がついたフォームの入力内容を受け取る。

###before_action
```ruby
before_action 全アクションで共通する処理
ex) before_action :set_current_user, {only: [:edit, :update]}
```
どのアクションを呼び出す前でも、必ず記述した処理が実行される。ファイルの一番上に記述する。
{only: [:アクション名]} を用いることで、処理が実行されるアクションを限定することができる。

###ルーティングファイルで使うコード
#### getメソッド
```ruby:アプリ名/config/routes.rb
get "URL" => "コントローラ名#アクション名"
ex) get "/posts/index" => "posts#index"
```
指定した情報を取得する。データベースを変更しない場合は大体getを使う。getと下記のpostは、HTTPメソッドと呼ばれている。

#### postメソッド
```ruby:アプリ名/config/routes.rb
post "URL" => "コントローラ名#アクション名"
ex) post "/posts/create" => "posts#create"
```
データベースを変更する際、sessionの値を変更する際に使うメソッド。
HTTPメソッドは他にもいろいろあるらしいが、まだ学んでいないのでここでは省略。

#### 名前付きパラメータ
```ruby:アプリ名/config/routes.rb
get "posts/:id" => "posts#show"
```
ルーティングのURL部分に : で始まる文字列を置くと、その文字列はパラメータとして認識される。
そのため、この例でいえば、/posts/○○ のようなすべてのURLをshowアクションに誘導することができる。
その関係で /posts/index のようなルーティングは、/posts/:id のルーティングに引っかからないようその前に記述する必要がある。

###モデルファイルで使うコード
####validates
```ruby
validates :検証するカラム名, {検証する内容}
ex) validates :content, {presence: true}
```
不正なデータがデータベースに保存されないように、データをチェックする（バリデーション）。
主な検証内容は以下の通り。

| 検証内容| 意味 |
|:------:|:-------:|
| presecse: true  | そのカラムの値が存在するかどうかをチェックする  |  
| length: {maximum: 文字数} | 規定した文字数以上のデータは保存できないようにする  | 
| uniqueness: true|重複したデータがデータベースに存在するかどうかチェックする|

###マイグレーションファイルで使うコード
```ruby
add_column :テーブル名, :カラム名, :データ型
ex) add_column :users, :image_name, :string
```
既存のテーブルにカラムを追加する。changeメソッドの中に書く。

## コマンドライン
- `rails new アプリ名`
入力したアプリの名前と同名のフォルダが作成され、その中に開発に必要なフォルダやファイルが用意される。
<br>

- `rails server`
サーバーの起動。
<br>

- `rails g controller コントローラ名 アクション名`
コントローラの作成。gはgenerateでも可。
コントローラ名とアクション名は、HTTPメソッド（URL）と同じ名前を付けることが多い。
<br>

- `rails g model モデル名 カラム名:データ型`
マイグレーションファイルとモデルファイルの作成。
モデル名は単数形かつ一文字目を大文字にする。
<br>

- `rails g migration ファイル名`
マイグレーションファイルのみを作成。
ファイル名は add_image_name_to_users などの分かりやすい名前にする。

- `rails db:migrate`
データベースへのマイグレーションファイルの反映。
マイグレーションファイルを作ったのにこれを実行しないとエラーが発生する。
<br>

##まとめ
[progate](https://prog-8.com/)はよいです。

##参考にした記事
- [【入門編】サーバーとは？役割や種類をわかりやすく解説！](https://www.internetacademy.co.jp/trends/it-strategy/what-is-server-introductory.html)
- [ビューの基本](https://www.buildinsider.net/web/rubyonrails4/0203)
- [Railsのmodelを徹底解説！知っておくべき3つの知識も紹介](https://udemy.benesse.co.jp/development/web/rails-model.html)
- [Node.js + Express の URLルーティング](https://garafu.blogspot.com/2017/03/nodejs-express-url-routing.html)

##参考にした書籍
- [現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4-ebook/dp/B07JHQ9B5T)