はじめに
rails初心者です。
現在、railsチュートリアルという教材を使用して、マイクロポストに画像を表示できるようにしているのですが、次の部分に疑問を持ったので質問させていただきます。
質問1
例えば、以下のようなコードの場合、<%= micropost.id %>
のmicropost
はモデル名ですか?
そう思った理由は、画像によるとモデル名は「Micropost」でテーブル名が「microposts」だからです。
質問2
また、なぜコード2の<%= render @feed_items %>
でファイル「_micropost.html.erb」(コード1)を呼び出せるのですか?
コード
コード1:「以下のようなコード」の全文
# ファイル名:views/microposts/_micropost.html.erb # ↓↓↓↓↓↓↓ここ↓↓↓↓↓↓↓ <li id="micropost-<%= micropost.id %>"> <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> <span class="user"><%= link_to micropost.user.name, micropost.user %></span> <span class="content"> <%= micropost.content %> <% if micropost.image.attached? %> <%= image_tag micropost.image.variant(:display) %> <% end %> </span> <span class="timestamp"> Posted <%= time_ago_in_words(micropost.created_at) %> ago. </span> </li>
コード2:「コード1」を呼び出すファイル
# ファイル名:views/shared/_feed.html.erb <% if @feed_items.any? %> <ol class="microposts"> # ↓↓↓↓↓↓↓ここ↓↓↓↓↓↓↓ <%= render @feed_items %> </ol> <%= will_paginate @feed_items, params: { controller: :static_pages, action: :home } %> <% end %>
コード3:「コード2」の「@feed_items」を定義しているファイル
# ファイル名:controllers/microposts_controller.rb class MicropostsController < ApplicationController before_action :logged_in_user, only: [:create, :destroy] def create @micropost = current_user.microposts.build(micropost_params) @micropost.image.attach(params[:micropost][:image]) if @micropost.save flash[:success] = "Micropost created!" redirect_to root_url else # ↓↓↓↓↓↓↓ここ↓↓↓↓↓↓↓ @feed_items = current_user.feed.paginate(page: params[:page]) render 'static_pages/home', status: :unprocessable_entity end end def destroy end private def micropost_params params.require(:micropost).permit(:content, :image) end end
コード4:「コード3」の「current_user」を定義しているファイル
# ファイル名:helpers/sessions_helper.rb # 「@feed_items = current_user.feed.paginate(page: params[:page])」の「current_user」 # 記憶トークンcookieに対応するユーザーを返す def current_user if (user_id = session[:user_id]) @current_user ||= User.find_by(id: user_id) elsif (user_id = cookies.encrypted[:user_id]) user = User.find_by(id: user_id) if user && user.authenticated?(cookies[:remember_token]) log_in user @current_user = user end end end
コード5:「コード3」の「feed」を定義しているファイル
# ファイル名:models/user.rb # 「@feed_items = current_user.feed.paginate(page: params[:page])」の「feed」 def feed Micropost.where("user_id = ?", id) end
その他:User/Micropostの関連付け
図1 MicropostとそのUserは belongs_to(1対1)の関係性がある
図2 UserとそのMicropostは has_many(1対多)の関係性がある
回答1件
あなたの回答
tips
プレビュー