mmfkzwtty0505
@mmfkzwtty0505

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

プロフィール画像が表示されない

解決したいこと

ユーザー情報にプロフィール画像を表示させたいのですが、以下のエラーが表示されました。
どなたか教えていただきたいです。
該当コードが少ない場合はコメントしていただければ幸いです。

発生している問題・エラー

NameError in Users#show
Showing /home/ec2-user/environment/bookers2_2/app/views/users/_userinfo.html.erb where line #4 raised:

undefined local variable or method `book' for #<ActionView::Base:0x0000000000c058>
Did you mean?  @book
               @books

該当するソースコード

controllers/users_controller.rb
class UsersController < ApplicationController
  
  before_action :ensure_current_user,{only:[:edit,:update]}
  
  def ensure_current_user
    @user = User.find(params[:id])
    if @user.id != current_user.id
      redirect_to user_path(current_user.id)
    end
  end
  
  def new
    @book=Book.new
  end

  def edit
    @user=User.find(params[:id])
  end

  def index
    @users=User.all
    @book=Book.new
    @user=current_user
  end

  def show
    @user=User.find(params[:id])
    @books=@user.books
    @book=Book.new
  end
  
  def create
    @book=Book.new(book_params)
    @book.user_id=current_user.id
    @book.save
    redirect_to book_path(@book.id)
    flash[:success]="You have created book successfully."
  end
  
  def update
    @user = User.find(params[:id])
    if @user.update(user_params)
        redirect_to user_path(@user.id)
        flash[:success] = "You have updated user successfully."
    else
      render :edit
    end
  end
    
    private
    
    def user_params
      params.require(:user).permit(:name, :profile_image, :introduction)
    end
    
    def book_params
      params.require(:book).permit(:title, :body)
    end
end
views/users/_userinfo.html.erb
<h1>User info</h1>
  <table class="table">
    <tr>
      <td><%= image_tag book.user.get_profile_image(100,100) %></td>
      <td></td>
    </tr>
    <tr>
      <td>name</td>
      <td>introduction</td>
    </tr>
    <tr>
      <td><%= user.name %></td>
      <td><%= user.introduction %></td>
    </tr>
  </table>

<%= link_to edit_user_path(user.id), class:"btn btn-block btn-outline-secondary p-0 mt-3" do %>
  <i class="fas fa-user-cog"></i>
<% end %>
views/users/show.html.erb
<div class="container pt-3 pb-5">
  <div class="row">
    <div class="col-md-3 pr-1">
      <%= render "users/userinfo",user:@user %>
      <%= render "books/books",book:@book %>
    </div>

    <div class="col-md-8 offset-md-1">
      <hi>Books</hi>
      <table class="table">
        <thead>
          <tr>
            <th></th>
            <th>Title</th>
            <th>Opinion</th>
          </tr>
        </thead>
        <% @books.each do |book| %>
          <tbody>
            <tr>
              <td>
                <%= link_to user_path(@user.id) do %>
                  <%= image_tag book.user.get_profile_image(100,100) %>
                <% end %>
              </td>
              
              <td>
                <%= link_to book_path(book.id) do %>
                  <%= book.title %>
                <% end %>
              </td>
              <td>
                <%= book.body %>
              </td>
            </tr>
          </tbody>
        <% end %>
      </table>
    </div>
  </div>
</div>
models/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
         
  validates:name,
    presence:true,
    length:{minimum:2,maximum:20},
    uniqueness:true
    
  validates:introduction,
    length:{maximum:50}
    
  has_many :books,dependent: :destroy
  
end
0

1Answer

エラー文を見る限り、views/users/_userinfo.html.erbに対して、bookという変数を渡せていないようです。
userは渡せているようなので、同様にbookも渡せばいけると思います!

0Like

Comments

  1. @mmfkzwtty0505

    Questioner

    @apierce
    回答ありがとうございます。

    image_tag @book.user.get_profile_image(100,100)
    変数を渡すということはこういうことでしょうか。
    初心者すぎる質問で申し訳ございません。

  2. @mmfkzwtty0505

    views/users/_userinfo.html.erbで、userという変数を参照できているのは、部分テンプレートに対して、以下のように変数を渡すことができているからです。

    views/users/show.html.erb
      <%= render "users/userinfo",user:@user %>
    

    これと同様に@bookviews/users/_userinfo.html.erbに対して渡してあげれば良いです。

    views/users/show.html.erb
      <%= render partial 'users/userinfo', locals: { user:@user, book: @book } %>
    

  3. @mmfkzwtty0505

    Questioner

    @apierce
    ご指摘いただいた箇所を修正したところ、

    NoMethodError in Users#show
    Showing /home/ec2-user/environment/bookers2_2/app/views/users/show.html.erb where line #4 raised:
    
    undefined method `partial' for #<ActionView::Base:0x0000000000eab0>
    

    このようになりました。

    partialをどこかで定義したら良いのでしょうか。

  4. @mmfkzwtty0505

    すみません、:が抜けてました🙇‍♂️

      <%= render: partial 'users/userinfo', locals: { user:@user, book: @book } %>
    

Your answer might help someone💌