前提・実現したいこと
Bookers2という閲覧、投稿サイトにフォロー・フォロワー機能を追加したいのですが、
NameError in Users#show が発生してしましました。
定義を確認してみたのですが間違っている部分が見つけられなかったので、教えていただきたいです。
まだ勉強を始めたばかりの初心者ですので、余裕があれば解説していただけると助かります。
また、初投稿なので質問できていない部分があれば教えてください。
よろしくお願いいたします。
発生している問題・エラーメッセージ
NameError in Users#show ndefined local variable or method `users' for #<#<Class:0x00007f5df5903e90>:0x00007f5df5901d70> Did you mean? user @user というエラーメッセージが出ています。 ### 該当のソースコード ```ruby エラーが発生していたファイル ```ruby /app/views/users/_info.html.erb(ファイル) <table class='table'> <thead> <tr> <th>image</th> <th>name</th> <th colspan="3"></th> </tr> </thead> <tbody> <% users.each do |user| %> <th> <td><%= attachment_image_tag(user, :profile_image, :fill, 100, 100, fallback: "no_image.jpg") %></td> <td><%= user.name %></td> <td>フォロー数: <%= user.followings.count %></td> <td>フォロワー数: <%= user.followers.count %></td> <td> <% if current_user != user %> <% if current_user.following?(user) %> <%= link_to "フォロー外す", user_relationships_path(user.id), method: :delete %> <% else %> <%= link_to "フォローする", user_relationships_path(user.id), method: :post %> <% end %> <% end %> </td> <td><%= link_to 'Show', user_path(user), class: "user_#{user.id}" %></td> </tr> <% end %> </tbody> </table>
usersのcontrollerファイル
ruby
1users_controller(ファイル) 2 3class UsersController < ApplicationController 4 before_action :authenticate_user!, except: [:home, :about] 5 before_action :ensure_correct_user, only: [:edit, :update] 6 7 def show 8 @user = User.find(params[:id]) 9 @books = @user.books 10 @book = Book.new 11 end 12 13 def index 14 @users = User.all 15 @book = Book.new 16 end 17 18 def edit 19 @user = User.find(params[:id]) 20 end 21 22 def update 23 if @user.update(user_params) 24 redirect_to user_path(@user), notice: "You have updated user successfully." 25 else 26 render "edit" 27 end 28 end 29 30 private 31 def user_params 32 params.require(:user).permit(:name, :introduction, :profile_image) 33 end 34 35 def ensure_correct_user 36 @user = User.find(params[:id]) 37 unless @user == current_user 38 redirect_to user_path(current_user) 39 end 40 end 41end 42
routesのファイル
routes
1 2Rails.application.routes.draw do 3 get 'followings' => 'relationships#followings', as: 'followings' 4 get 'followers' => 'relationships#followers', as: 'followers' 5 devise_for :users 6 7 8 root to: 'homes#top' 9 get '/home/about' => 'homes#about' 10 11 resources :books, only: [:index, :show, :edit, :create, :destroy, :update] 12 resources :users, only: [:index, :show, :edit, :update] do 13 resource :relationships, only: [:create, :destroy] 14 get 'followings' => 'relationships#followings', as: 'followings' 15 get 'followers' => 'relationships#followers', as: 'followers' 16 end 17 18end
今回、フォロー・フォロワー機能を追加するにあたり、作成したファイル
ruby
1models/relationship.rb(ファイル) 2 3class Relationship < ApplicationRecord 4 belongs_to :follower, class_name: "User" 5 belongs_to :followed, class_name: "User" 6end
今回作成したファイル
ruby
1controllers/relationships_controller.rb(ファイル) 2 3class RelationshipsController < ApplicationController 4 def create 5 current_user.follow(params[:user_id]) 6 redirect_to request.referer 7 end 8 9 def destroy 10 current_user.unfollow(params[:user_id]) 11 redirect_to request.referer 12 end 13 14 def followings 15 user = User.find(params[:user_id]) 16 @users = user.followings 17 end 18 19 def followers 20 user = User.find(params[:user_id]) 21 @users = user.followers 22 end 23end
今回、修正・追加したファイル
ruby
1user.rb 2 3class User < ApplicationRecord 4 # Include default devise modules. Others available are: 5 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 6 devise :database_authenticatable, :registerable, 7 :recoverable, :rememberable, :validatable 8 9 has_many :books 10 has_many :book_comments, dependent: :destroy 11 12 has_many :reverse_of_relationships, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy 13 has_many :relationships, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy 14 has_many :followers, through: :reverse_of_relationships, source: :follower 15 has_many :followings, through: :relationships, source: :followed 16 17 attachment :profile_image, destroy: false 18 19 validates :name, uniqueness: true, length: {maximum: 20, minimum: 2} 20 validates :introduction, length: {maximum: 50} 21 22 def follow(user_id) 23 relationships.create(followed_id: user_id) 24 end 25 26 def unfollow(user_id) 27 relationships.find_by(followed_id: user_id).destroy 28 end 29 30 def following?(user) 31 followings.include?(user) 32 end 33 34end 35
今回ほぼ触ってませんが、エラー画面に出ていたので念のため。
ruby
1view/users/show.html 2 3<div class='container px-5 px-sm-0'> 4 <div class='row'> 5 <div class='col-md-3'> 6 <h2>User info</h2> 7 <%= render 'info', user: @user %> 8 <h2 class="mt-3">New book</h2> 9 <%= render 'books/form', book: @book %> 10 </div> 11 <div class='col-md-8 offset-md-1'> 12 <h2>Books</h2> 13 <%= render 'books/index',books: @books %> 14 </div> 15 </div> 16</div>
ruby
1コード
試したこと
Did you mean? user
@user
という文字があったため@userにもしてみましたが変わりませんでした。
また、定義を一通り確認してみましたが、間違っている部分は見つかりませんでした。
each文も間違っている箇所はみつけられませんでした。
補足情報(FW/ツールのバージョンなど)
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
Rails 5.2.5
gem 3.0.8
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/10 14:25
2021/09/11 10:46 編集
2021/09/14 16:36