質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 3

Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

解決済

【Ruby on Rails】Micropostでお気に入りを一覧表示させるときに別モデルを参照させたい。

alfabeta
alfabeta

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 3

Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

1回答

0評価

0クリップ

111閲覧

投稿2022/05/27 15:38

よろしくお願いします。
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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 3

Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。