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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

4381閲覧

【Ruby on Rails】フォロー機能 フォロー数とフォロワー数を表示させたい

is02

総合スコア17

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/01/17 04:30

前提

非同期でフォロー機能を実装済み

実現したいこと

フォロー数とフォロワー数を表示させたい

発生している問題・エラーメッセージ

**「undefined method `following'」**というエラーメッセージが表示されます。
イメージ説明

該当のソースコード

【モデル】

user.rb

class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :post_images, dependent: :destroy has_many :favorites, dependent: :destroy has_many :fav_post_images, through: :favorites, source: :post_image has_many :cosplay_favorites, dependent: :destroy has_many :cosplay_fav_post_images, through: :favorites, source: :post_image has_many :post_comments, dependent: :destroy has_many :relationships has_many :followings, through: :relationships, source: :follow has_many :reverse_of_relationships, class_name: 'Relationship', foreign_key: 'follow_id' has_many :followers, through: :reverse_of_relationships, source: :user validates :name, presence: true, length: { in: 2..15 } attachment :profile_image def follow(other_user) unless self == other_user self.relationships.find_or_create_by(follow_id: other_user.id) end end def unfollow(other_user) relationship = self.relationships.find_by(follow_id: other_user.id) relationship.destroy if relationship end def following?(other_user) self.followings.include?(other_user) end end

relationship.rb

class Relationship < ApplicationRecord belongs_to :user # userモデルを参照する belongs_to :follow, class_name: 'User' validates :user_id, presence: true validates :follow_id, presence: true end

【コントローラー】

users_controller.rb

class UsersController < ApplicationController def show @user = User.find(params[:id]) @post_images = @user.post_images.page(params[:page]).reverse_order end def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) @user.update(user_params) redirect_to user_path(@user.id) end def following @user = User.find(params[:id]) @users = @user.following render 'show_follow' end def followers @user = User.find(params[:id]) @users = @user.followers render 'show_follower' end private def user_params params.requrie(:user).permit(:name, :profile_image) end end

relationships_controller.rb

class RelationshipsController < ApplicationController before_action :set_user def create following = current_user.follow(@user) following.save respond_to do |format| format.html { redirect_to @user } format.js end end def destroy following = current_user.unfollow(@user) following.destroy respond_to do |format| format.html { redirect_to @user } format.js end end private def set_user @user = User.find(params[:follow_id]) end end

【ビュー】

users/show.html.erb

<div class="header"> <nav class="navigation"> <img src="/assets/logo.png"> <ul> <li> <%= link_to "ログアウト", destroy_user_session_path, method: :delete %> </li> <li> <%= link_to '投稿一覧', root_path %> </li> <li> <%= link_to 'マイページ', user_path(current_user.id) %> </li> </ul> </nav> </div> <div class="mypage_wrapper"> <div class="profile_image"> <%= attachment_image_tag @user, :profile_image, format: 'jpeg', fallback: "no_image.jpg" %> </div> <div class="profile_content"> <h1><%= @user.name %></h1> <% if @user.id == current_user.id %> <%= link_to "プロフィール編集", edit_user_path(@user), class: "profile_edit_path" %> <% end %> <%= link_to following_user_path(@user) do %> <%= @user.following.count %> <% end %> <%= link_to followers_user_path(@user) do %> <%= @user.followers.count %> <% end %> </div> </div>

users/show_follow.html.erb

<% @user.following.each do |user| %> <%= user.name %> <%= link_to '詳細', user_path(user) %> <% end %>

users/show_follower.html.erb

<% @user.followers.each do |user| %> <%= user.name %> <%= link_to '詳細', user_path(user) %> <% end %>

【ルーティング】

routes.rb

Rails.application.routes.draw do devise_for :users root 'post_images#index' resources :post_images, only: [:new, :create, :index, :show, :destroy] do resource :post_comments, only: [:create, :destroy] end resources :users do member do get :following, :followers end end post '/favorite/:id' => 'favorites#favorite', as: 'favorite' post '/cosplay_favorite/:id' => 'cosplay_favorites#favorite', as: 'cosplay_favorite' resources :relationships, only: [:create, :destroy] # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end

試したこと

followingがusers_controllerで定義されていないというエラーメッセージだと思うのですが、
def following
@user = User.find(params[:id])
@users = @user.following←ここで定義しているという認識でした。
render 'show_follow'
end

疑問点

・@users = @user.followingのfollowingはどこからきているのか
・users_controllerの@usersを定義している意味

補足情報(FW/ツールのバージョンなど)

ruby 2.5.7p206
Rails 5.2.4.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

followingがusers_controllerで定義されていないというエラーメッセージだと思うのですが、

違います。

undefined method `following' for #<User:0x00...>

Userクラスインスタンスにfollowingというメソッドが定義されていないというエラーです。

def following

@user = User.find(params[:id])
@users = @user.following←ここで定義しているという認識でした。
render 'show_follow'
end

定義しているのではなくメソッドを呼び出しているだけです。

Userモデルに

rb

1has_many :followings, through: :relationships, source: :follow

とあるのでfollowingではなくfollowingsでは?

rb

1@users = @user.followings

投稿2020/01/17 05:15

Mugheart

総合スコア2344

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

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

is02

2020/01/17 05:29

エラーメッセージにそのような意味があるのが分かりませんでした。 おっしゃられた通り、followingsにしたところ、正常に作動致しました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問