コントローラとviewの関係こんな感じ!?というイメージが沸いたのでメモ。
静的サイトを作った後に動的サイトに初めて取り掛かるレベル(´・ω・`)
間違ってるかも。超初心者の感覚をつかむための備忘録。
すごく簡素な色んな人が投稿できる日記サイトを作りたい。
こんな感じの2つのテーブルがあるとする↓
usersテーブル
id | name | |
---|---|---|
1 | 佐藤太郎 | satou@xxxcom |
2 | 鈴木次郎 | suzuki@xxxcom |
3 | 高橋瑠美 | takahashi@xxxcom |
listsテーブル
id | title | body | user_id |
---|---|---|---|
1 | 夏休み! | 海にいきました! | 2 |
2 | ふゆやすみ! | スキーに行った! | 3 |
3 | あきやすみ | そんなものは無い! | 2 |
4 | 今日も今日とて | 対戦よろしくお願いします | 1 |
ユーザテーブルのidとuser_idが連携してるから、参照出来るよ~という関係
コードで書きたいこと
投稿の一覧を表示して、投稿した人の名前を押すと、 views/lists/index.html.erb $\huge{↓}$その人の日記が表示されるのviewを作りたい
/views/user/show.html.erb
views/lists/index.html.erbのコード(CSSとかはガン無視)
<div>タイトル</div><div>投稿した人</div>
<% @lists.each do |list| %>
<%= list.title %>
<%= link_to list.user.name, list_path(list.user.id) %>
<% end %>
each文は分かりやすい記事がたくさんあるので省略
viewにとって@listsはこのままだと分からないからコントローラが何を示すのか教えてあげないといけない(定義しないといけない)。
@listsは全ユーザの全投稿を渡してあげるから、コントローラで
def index
@lists = List.all
end
を定義してあげる
くまがコントローラ、ひよこがviewのイメージです。
そしてこのlist.user.id
はどうなってるんだ~って感じですが、
こういう時に何等親か数える時みたいなたどり方をする(と思う)
こういうやつ
どういう意味か分からんが???となると思うので図↓
何等親か数える時って長男→次男って数え方をせずに長男→親→次男で2等親って数え方をします。
引数もlist→nameで(list.name)とは表記が出来ず、list→user→name(list.user.name)で引数を参照します
(追記:この参照をするにはListsとUsersを多対1の関係で定義しないと出来ない。いつかちゃんと説明書く)
つまりlistsのループにいてlistが手に入っているのでlistからスタートし
そこから.userでUsersテーブルに行き、idでuser.idを見つけ出すので
list.user.nameだと名前が表示される(ということだと思う)
そしてユーザーが名前を押すとuser_path(list.user.id)に飛んでくれとコードに書いてあるのでusers/show.html.erbに行きたい。
(link_toやroutes.rbの説明は分かりやすい記事が沢山あるので省略)
仮に鈴木次郎をクリックしたとすると
(list.user.id)は2となる(図参照)
しかし「このidを抽出してるよ!」とちゃんと定義してあげないとviewで使えないのでコントローラで定義してあげます。
def show
@user = User.find(params[:id])
@lists = @user.lists
end
@lists=@user.listsは@userの人の日記だけ抽出して@listsに格納する定義。
これを図で表すとこんな感じ!
こうすることによって引数を利用してviewを表示させることが出来ました。
<%= @user.name %>
のにっき
<div>タイトル</div><div>本文</div>
<% @lists.each do |list| %>
<%= list.user.title %>
<%= list.user.body %>
<% end %>
めでたしめでたし。
間違ってたり追加で書いた方が良いことあったら教えてくださいっ!
メモ:showのメゾットが終わったらインスタンス変数の記憶はまた変わるので、色んな複雑な処理が出来る。
かしこいなあ~
訂正:テーブルのidは0からでした!ごめんなさい!
画像はぴよたそ様よりお借りしました。
https://hiyokoyarou.com/