よろしくお願いします。
RubyでTwitterクローンアプリ(Micropost)を作っています。
- 表示させたいcontentカラムがあるモデル:Microposts
- 中間モデル:Favorites ーuser idとmicropost idのみ
- 一覧表示させるページ:User#likes.html.erb
- (パーシャル)microposts.html.erb:micropostの一覧を表示させるパーツ
- (パーシャル)like_button.html.erb:お気に入りに追加/削除するボタンのパーツ
like.html内にlike_buttonをレンダーしたmicropostをレンダーさせています。このパーシャルに@favoriteを渡すと以下のエラーがでます。
エラーの内容
参照させているモデルがFavoriteであるためなのはわかっているのですが、ここからMicropostsモデルのcontentを参照させるにはどうしたらよいかがわからず困っています。
どうぞよろしくお願いします。
関係するコード
likes.html.erb <div class="row"> <aside class="col-sm-4"> <div class="card"> <div class="card-header"> <h3 class="card-title"><%= @user.name %></h3> </div> <div class="card-body"> <img class="rounded img-fluid" src="<%= gravatar_url(@user, { size: 500 }) %>" alt=""> </div> </div> </aside> <div class="col-sm-8"> <ul class="nav nav-tabs nav-justified mb-3"> <li class="nav-item"><a href="<%= user_path(@user) %>" class="nav-link <%= 'active' if current_page?(user_path(@user)) %>">Microposts <span class="badge bg-secondary"><%= @count_microposts %></span></a></li> <li class="nav-item"><a href="<%= followings_user_path(@user) %>" class="nav-link <%= 'active' if current_page?(followings_user_path(@user)) %>">Followings <span class="badge bg-secondary"><%= @count_followings %></span></a></li> <li class="nav-item"><a href="<%= followers_user_path(@user) %>" class="nav-link <%= 'active' if current_page?(followers_user_path(@user)) %>">Followers <span class="badge bg-secondary"><%= @count_followers %></span></a></li> <li class="nav-item"><a href="<%= likes_user_path(@user) %>" class="nav-link <%= 'active' if current_page?(likes_user_path(@user)) %>">Favorites <span class="badge bg-secondary"><%= @count_favorites %></span></a></li> </ul> <%= render 'microposts/microposts', microposts: @favorites %> </div> </div>
microposts.html.erb <% if microposts.any? %> <ul class="list-unstyled mt-2"> <% microposts.each do |micropost| %> <li class="d-flex"> <img class="rounded me-2 mb-5" src="<%= gravatar_url(micropost.user, { size: 64 }) %>" alt=""> <div> <div> <%= link_to micropost.user.name, user_path(micropost.user), class: "text-decoration-none" %> <span class="text-muted">posted at <%= micropost.created_at %></span> </div> <div> <p><%= micropost.content %></p> </div> <div class='btn-toolbar' role='toolbar'> <%= render 'favorites/like_button', micropost: micropost %> <% if current_user == micropost.user %> <%= link_to "Delete", micropost, method: :delete, data: { confirm: "You sure?" }, class: 'btn btn-danger btn-sm' %> <% end %> </div> </div> </li> <% end %> </ul> <%== pagy_bootstrap_nav(@pagy) %> <% end %>
_like_button.html.erb <% if current_user.like?(micropost) %> <%= form_with(model: current_user.favorites.find_by(micropost_id: micropost.id), method: :delete) do |f| %> <%= hidden_field_tag :micropost_id, micropost.id %> <%= f.submit 'Unfavorite', class: 'btn btn-danger btn-sm' %> <% end %> <% else %> <%= form_with(model: current_user.favorites.build, local: true) do |f| %> <%= hidden_field_tag :micropost_id, micropost.id %> <%= f.submit 'Favorite', class: 'btn btn-primary btn-sm'%> <% end %> <% end %>
users_controller.rb class UsersController < ApplicationController before_action :require_user_logged_in, only: [:index, :show, :followings, :followers] def index @pagy, @users = pagy(User.order(id: :desc), items: 25) end def show @user = User.find(params[:id]) @pagy, @microposts = pagy(@user.microposts.order(id: :desc)) counts(@user) end def new @user = User.new end def create @user = User.new(user_params) if @user.save flash[:success] = 'ユーザを登録しました。' redirect_to @user else flash.now[:danger] = 'ユーザの登録に失敗しました。' render :new end end def followings @user = User.find(params[:id]) @pagy, @followings = pagy(@user.followings) counts(@user) end def followers @user = User.find(params[:id]) @pagy, @followers = pagy(@user.followers) counts(@user) end def likes @user = User.find(params[:id]) @pagy, @favorites = pagy(current_user.feed_likes.order(id: :desc)) counts(@user) end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。