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

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

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

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

Q&A

解決済

1回答

1400閲覧

rubyのTemplate::Error(userが未定義?)を解消したい

TAKU.1

総合スコア1

Ruby

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

0グッド

0クリップ

投稿2021/09/10 13:33

前提・実現したいこと

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージを見ると、users_controller の show メソッドが呼ばれていて、以下の処理で取得した @変数名 が、表示用の show.html.erb に渡されます。

def show @user = User.find(params[:id]) @books = @user.books @book = Book.new end

~~show.html.erb のソースコードを見ると、

<%= render 'books/form', book: @book %> や <%= render 'books/index',books: @books %>

といったファイルがさらに差し込まれているので、最終的に show.html.erb から、_info.html.erb が呼ばれているようですね。~~

20210911 修正

show.html.erb の上のほうで、 <%= render 'info', user: @user %> とあるので、ここで呼び出していましたね。

この_info.html.erb に期待しているローカル変数 (users) が渡ってきていないので、エラーになっているようです。

<%= render 'info', users: @user.followers %> とか、
<%= render 'info', users: @user.following %> とかにするといかがでしょう?

あるいは、Users#show のところで、@books や @book を取り出しているように、先にフォロー関係にあるレコードを取り出して @users とか @followers として、_info.html.erb に渡してあげるとか。

<%= render 'info', users: @followers %>

失礼いたしました。

投稿2021/09/10 14:07

編集2021/09/11 10:52
suama

総合スコア1997

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

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

TAKU.1

2021/09/10 14:25

新しくrelationships_controllerで定義をした方がよろしいのでしょうか。それともusers_controller で定義し直す方がよろしいのでしょうか。 show.html.erbへの影響が出ないようにするにはどのように定義をすればいいのかわからないので教えていただけると助かります。
suama

2021/09/11 10:46 編集

こんにちは。 失礼しました、見落としていました! 上の方に、<%= render 'info', user: @user %> がありますね! ここが問題でしたね。 users/_info.html.erb の、ローカル変数として users が必要ですが、呼び出し側の show.html.erb では、<%= render 'info', user: @user %> としているため、user というローカル変数、しかも単数でしか渡っていません。 単数のモデルなので、foreach といったループ処理ができないので、エラーになっていると思います。 users/_info.html.erb の、ローカル変数としての users は、なにかしら コレクション(複数のUserのレコード)をご想定かと思います。 Users#show で特定のユーザーを @user で取り出しつつ、その @user のフォロワー(複数)を users/_info.html.erb で表示するという内容でしょうか。 であれば、 <%= render 'info', user: @user %> ではなくて、 <%= render 'info', users: @user.followers %> とか、 <%= render 'info', users: @user.following %> とかでしょうか。 いかがでしょう。
TAKU.1

2021/09/14 16:36

users_controllerに@users = User.allを追加してusers_show.htmlにusers: @usersを追加して解決できました。返事が遅くなりましたが、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問