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モデルのデータを引き出している