1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsのコントローラとviewの引数受け渡しとはこういうことか!【超初心者】

Last updated at Posted at 2021-02-14

コントローラとviewの関係こんな感じ!?というイメージが沸いたのでメモ。
静的サイトを作った後に動的サイトに初めて取り掛かるレベル(´・ω・`)
間違ってるかも。超初心者の感覚をつかむための備忘録。

すごく簡素な色んな人が投稿できる日記サイトを作りたい。
こんな感じの2つのテーブルがあるとする↓

usersテーブル
id name email
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とかはガン無視)

views/lists/index.html.erb
<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は全ユーザの全投稿を渡してあげるから、コントローラで

controllers/lists_controller.rb
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で使えないのでコントローラで定義してあげます。

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

@lists=@user.listsは@userの人の日記だけ抽出して@listsに格納する定義。
これを図で表すとこんな感じ!


こうすることによって引数を利用してviewを表示させることが出来ました。

views/users/show.html.erb
<%= @user.name %>
のにっき
<div>タイトル</div><div>本文</div>
<% @lists.each do |list| %>
<%= list.user.title %>
<%= list.user.body %>
<% end %>

めでたしめでたし。
 
間違ってたり追加で書いた方が良いことあったら教えてくださいっ!

メモ:showのメゾットが終わったらインスタンス変数の記憶はまた変わるので、色んな複雑な処理が出来る。
かしこいなあ~

訂正:テーブルのidは0からでした!ごめんなさい!

画像はぴよたそ様よりお借りしました。
https://hiyokoyarou.com/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?