🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

339閲覧

フォロー中のユーザーの全ツイートをトップページに表示

shawn_709

総合スコア13

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/12/04 07:59

ご回答いただけるとありがたいです。よろしくお願いします!

実現したいこと

フォロー中のユーザーのツイートをトップページに表示させたい。

現状

以下を参考にして、フォロー・フォロワー機能の実装は済んでいます。
https://qiita.com/mitsumitsu1128/items/e41e2ff37f143db81897

該当のソースコード

コントローラー、モデル、ビュー、のどれをどのように動かせば良いかわかっていない状態なので、該当のソースコードに関係ないものが含まれているかもしれません。

routes

1Rails.application.routes.draw do 2 devise_for :users 3 root to: "relationships#index" 4 resources :groups do 5 member do 6 get :join 7 delete :quit 8 end 9 collection do 10 get :list 11 get :search 12 end 13 resources :tweets 14 end 15 resources :users, only: [:show, :edit, :update] 16 resources :relationships, only: [:index, :create, :destroy] do 17 member do 18 get :following 19 get :follower 20 end 21 end 22end

controller

1#relationships 2class RelationshipsController < ApplicationController 3 before_action :set_user, only: [:create, :destroy] 4 5 def index 6   #ここに記述が必要ではないかと考えている。 7 end 8 9 def create 10 following = current_user.follow(@user) 11 following.save 12 redirect_to @user 13 end 14 15 def destroy 16 following = current_user.unfollow(@user) 17 following.destroy 18 redirect_to @user 19 end 20 21 def following 22 @user = User.find(params[:id]) 23 @followings = @user.followings 24 end 25 26 def follower 27 @user = User.find(params[:id]) 28 @followers = @user.followers 29 end 30 31 private 32 33 def set_user 34 @user = User.find(params[:follow_id]) 35 end 36 37end

model

1#relationship 2class Relationship < ApplicationRecord 3 belongs_to :user 4 belongs_to :follow, class_name: 'User' 5 6 validates :user_id, presence: true 7 validates :follow_id, presence: true 8end 9 10#tweet 11class Tweet < ApplicationRecord 12 belongs_to :group 13 belongs_to :user 14 has_one_attached :image 15 16 validates :content, presence: true, unless: :was_attached? 17 18 def was_attached? 19 self.image.attached? 20 end 21end 22 23#user 24class User < ApplicationRecord 25 devise :database_authenticatable, :registerable, 26 :recoverable, :rememberable, :validatable 27 28 validates :nickname, presence: true 29 30 has_many :group_users 31 has_many :groups, through: :group_users 32 has_many :tweets 33 has_many :owned_groups, class_name: "Group" 34 35 has_many :relationships 36 has_many :followings, through: :relationships, source: :follow 37 has_many :reverse_of_relationships, class_name: 'Relationship', foreign_key: 'follow_id' 38 has_many :followers, through: :reverse_of_relationships, source: :user 39 40 def follow(other_user) 41 unless self == other_user 42 self.relationships.find_or_create_by(follow_id: other_user.id) 43 end 44 end 45 46 def unfollow(other_user) 47 relationship = self.relationships.find_by(follow_id: other_user.id) 48 relationship.destroy if relationship 49 end 50 51 def following?(other_user) 52 self.followings.include?(other_user) 53 end 54 55end

views

1#relationship.html.erb 2<div class="tweets"> 3 <%= @tweets.each do |tweet| %> 4 <%= tweet.user.nickname %> 5 <%= tweet.content %> 6 <% end %> 7</div> 8#viewはまだ細かく記述していません。 9繰り返し処理を使って値を取得できるか確認するために、このような記述になっています。

###試したこと

controller

1#relationships 2def index 3 @followings = current_user.followings 4 @tweets = @followings.tweets 5end

Error

1NoMethodError in RelationshipsController#index 2 3undefined method `tweets' for #<User::ActiveRecord_Associations_CollectionProxy:0x00007f8bd4ecbd70> 4というエラー文が出ます。

以上になります。ご助言いただけると幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

tweetsメソッドはUserにあります。Userの集合体にはありません。@followingsは集合体なのでそういうエラーになります。
viewで <%= @tweets.each do |tweet| %>の部分を
@followings do |following| following.tweets.each do |tweet|
にしてください

投稿2020/12/04 11:56

編集2020/12/04 11:58
winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shawn_709

2020/12/04 12:21

ありがとうございます!!実装できました! もう一つ追加で質問させて下さい。 relationships_controllerで def index @followings = current_user.followings end としているのですが、current_userと書いている場合、ログアウトした時にトップページでエラーが起きるんですが、これはどのようにすれば解消できますか? 重ね重ねすみません。
winterboum

2020/12/04 12:22

どんなエラーか書いていただかないとなんにもわかりません
shawn_709

2020/12/04 13:11

すみません! ログイン状態だと問題なく動きます。 ログアウトすると NoMethodError in RelationshipsController#index undefined method `followings' for nil:NilClass というエラーが出ます。 コントローラーは def index @user = current_user @followings = @user.followings end です。お願いします!
shawn_709

2020/12/04 13:17

解決しました。すみません。 def index @user = current_user @followings = @user.try(:followings) end としてviewにuser_signed_in?メソッドを使いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問