Railsの処理の流れ

基本

Railsチュートリアルや書籍などでよく言われる
MVC
(モデル・コントローラー・ビュー)

実際の処理の流れは

CMV
コントローラ → モデル → ビュー

これが基本になるが、細かく言えばコントローラーに行く前にルーティングという処理も通る

なので、正確には
ルーティング → コントローラ → モデル → ビュー となる

ルーティング(routes.rb)で何をする?


ルーティングではURL(http://ほにゃらら/うんたら/)の部分で
http://ほにゃららにアクセスが来たら、
「コントローラー(○○_controller.rbファイル)の[うんたら]の処理をしてくださいね」というように、アクセスされたURLによって振り分けしてくれる部分

Rails.application.routes.draw do
  root 'static_pages#top'

  get 'login', to: 'user_sessions#new'
  post 'login', to: 'user_sessions#create'
  delete 'logout', to: 'user_sessions#destroy'
end


翻訳↓

Rails.application.routes.draw do
# rootはサイトのTOPページの部分であり / と書かれる
  root 'static_pages#top' 
 # ↑ http://localhost:3000/ にアクセスされた時、static_pages_controller.rbファイルのtopアクション(def top)に行く
  get 'login', to: 'user_sessions#new'
# ↑ http://localhost:3000/login にアクセスされた時、user_sessions_controller.rbファイルのnewアクション(def new)に行く
  post 'login', to: 'user_sessions#create'
# ↑ http://localhost:3000/login から何かしら入力したデータを送信した時、user_sessions_controller.rbファイルのcreateアクション(def create)に行く
  delete 'logout', to: 'user_sessions#destroy'
# ↑ http://localhost:3000/logout にアクセスされた時、user_sessions_controller.rbファイルのdestroyアクション(def destroy)に行く
end



コントローラーで何をする?

ターミナルでコントローラーを作成するときは複数形
コントローラー(〇〇_controller.rb)では上のルーティングで振り分けられた処理をします。ちょっとややこしいですが
controllers/user_sessions_controller.rb

class UserSessionsController < ApplicationController
  
  def new; end

  def create
    @user = login(params[:email], params[:password])
    if @user
      redirect_back_or_to boards_path, success: t('.success')
    else
      flash.now[:danger] = t('.fail')
      render :new
    end
  end

  def show
    @user = User.find(params[:id])
  end

  def edit; end

  def destroy
    logout
    redirect_to root_path, success: t('.success')
  end
end


翻訳↓ controllers/user_sessions_controller.rb

class UserSessionsController < ApplicationController

  def new; end
  # ↑ルーティングで振られたnewアクションだが特に処理は書いていないのでviewフォルダの中にあるuser_sessionsの(new.html.erbというファイル)を表示する

# ↓ルーティングで振られたcreateアクションの中
  def create # 作成(create)アクション
    @user = login(params[:email], params[:password])
# @userという変数に(=)、emailとpasswordのパラメーター(入力された値)を持ったloginを代入している
    if @user # もし@user(↑の値のデータをもつlogin)ならば
      redirect_back_or_to boards_path, success: t('.success') 
# boardsという別の処理にリダイレクトし,サクセス(成功)ということで"ログインしました"が画面に表示される❶
    else # もしくは
      flash.now[:danger] = t('.fail') 
      render :new
# newアクション(↑のdef new)のページにレンダリング(元になる情報を形成)してnew.html.erbに戻され、デンジャー(危険)で"ログインできませんでした"が表示される
    end
  end
#❶ success: t('.success')のsccess:はフラッシュといって画面に一時的に表示してくれる(ずっと表示もできる)機能でt('.success')はconfigフォルダ内に新たに作成したja.yml内に'ログインしました'を定義している(ja.ymlが適用されるにはgemfileに'rails-i18n'というgem(ジェム)と呼ばれる機能を追加してあげないといけない )

  def show # ルーティングでshowに振られたshowアクションの中
    @user = User.find(params[:id])
# [1]   @userには(=)Userクラス(User)のモデルに紐づいたidカラムにあるパラメーター(params[:id])を一つ取り出す(find)
  end

  def edit; end
# ルーティングでeditに振られたeditアクションの中はないのでnewと同様にedit.html.erbなどのviewを表示する

  def destroy #ルーティングでdestroyに振られたdestroyアクションの中
    logout # ログアウトしたら
    redirect_to root_path, success: t('.success') 
# ルートパス(/ のページ)にリダイレクトし、サクセス(成功)ということで'ログアウトしました'が表示される
  end
end

# * success: (サクセス)やdanger: (デンジャー)はbootstrapなどを入れることでcssやscssによって緑色や赤色で表示される
# ただsuccess:を入れれば言い訳ではなく、フラッシュメッセージを表示するviewの部分も作らないといけない



モデルで何をする?

モデルを作成するときは単数形
モデルはコントローラーとデータベースのやりとりをする場所
データベースに保存したり、データを引っ張ってきたりする
models/user.rb

class User < ApplicationRecord
end



ちなみにコントローラーで出た

@user = User.find(params[:id])

このUserという大文字の部分、

models/user.rb

class User < ApplicationRecord
#     ↑ この部分と同じ意味
end

つまり、なぜ大文字なのかというとUserモデルにアクセスしているので、
上の翻訳したコントローラー内の[1]に当たるわけである


また何でもかんでもデータベースに保存されては困るので、
例えば、以下の様に「空のまま送信できないようにする」とか、「文字数制限をつける」とかvalidate(検証)を決めることができる。

class User < ApplicationRecord
#      ↑ ユーザーの
  validates :first_name, presence: true, length: { maximum: 255 }
# ↑検証します 名字が空欄はダメで最大255文字まで
  validates :last_name, presence: true, length: { maximum: 255 }
# ↑検証します 名前が空欄はダメで最大255文字まで
  validates :email, presence: true, uniqueness: true
# ↑検証します メールアドレスが空欄はダメで値が重複していないこと
end



今回の場合、user_sessionsコントローラーでuserモデルのデータを引き出している