【rails7】undefined method `image' for nil:NilClassの解決方法
解決したいこと
Ruby on railsで簡単なSNSを作っているのですが、Active Storageでプロフィール画像を実装したところ、投稿の詳細画面(/posts/:id/show)の画面で以下のエラーが表示されます。
投稿一覧画面(/posts/index)ではプロフィール画像が表示されるため、ユーザーのプロフィール画像がnilになっていることが原因ではなさそうです。
よろしくお願いいたします。
undefined method `image' for nil:NilClass'.freeze;@output_buffer.append=( image_tag @user.image );@output_buffer.safe_append='
問題のエラーコード
<%= image_tag @user.image %>でエラーが発生しているようです。
<div class="main posts-show">
<div class="container">
<div class="posts-show-item">
<div class="post-user-name">
<%= image_tag @user.image %>
<%= link_to(@user.name,"/users/#{@user.id}") %>
<div class="posts-following-btn">
<%# フォローボタン %>
<% if current_user != @user %>
<% if current_user.following?(@user) %>
<%= button_to 'フォロー外す', user_relationships_path(@user.id), method: :delete %>
<% else %>
<%= button_to 'フォローする', user_relationships_path(@user.id), method: :POST %>
<% end %>
<% end %>
</div>
</div>
<p>
<%= @post.content %>
</p>
<div class="post-time">
<%= @post.created_at %>
</div>
<% if Like.find_by(user_id: current_user.id, post_id: @post.id) %>
<%= link_to("/likes/#{@post.id}/destroy", data:{turbo_method: :post}) do %>
<span class="fa fa-heart liked-btn"></span>
<% end %>
<% else %>
<%= link_to("/likes/#{@post.id}/create", data:{turbo_method: :post}) do %>
<span class="fa fa-heart unliked-btn"></span>
<% end %>
<% end %>
<%= @likes_count %>
<% if @post.user_id==current_user.id %>
<div class="post-menus">
<%= button_to "編集", "/posts/#{@post.id}/edit",{method:"get",class: "button_to2"} %>
<%= button_to "削除", "/posts/#{@post.id}/destroy", {method:"post" ,class: "button_to2"} %>
</div>
<% end %>
</div>
</div>
</div>
<% if user_signed_in? %>
<%= form_with model: [@post, @comment] do |f| %>
<%= f.text_area :comment_content,placeholder: 'コメントする' %>
<%= f.submit 'SEND' %>
<% end %>
<% end %>
<h2>コメント一覧</h2>
<% @comments.each do |c| %>
<%= c.comment_content %>
<hr>
<% end %>
posts_controller.rb
class PostsController < ApplicationController
before_action :ensure_correct_user,{only:[:edit,:update,:destroy]}
def index
@posts=Post.all.order(created_at: :desc)
end
def show
@post=Post.find_by(id: params[:id])
@likes_count=Like.where(post_id: @post.id).count
@comments = @post.comments.includes(:user)
@comment = Comment.new
end
def new
@post=Post.new
end
def create
@post=Post.new(
content: params[:content],
user_id: current_user.id
)
if @post.save
flash[:notice]="投稿を作成しました"
redirect_to("/posts/index")
else
render("posts/new",status: :unprocessable_entity)
end
end
def edit
@post=Post.find_by(id: params[:id])
end
def update
@post=Post.find_by(id: params[:id])
@post.content=params[:content]
if @post.save
flash[:notice]="投稿を編集しました"
redirect_to("/posts/index")
else
render "posts/edit", status: :unprocessable_entity
end
end
def destroy
@post=Post.find_by(id: params[:id])
@post.destroy
flash[:notice]="投稿を削除しました"
redirect_to "/posts/index"
end
def ensure_correct_user
@post=Post.find_by(id: params[:id])
if @post.user_id!=current_user.id
flash[:notice]="権限がありません"
redirect_to("/posts/index")
end
end
private
def post_params
params.require(:post).permit(:post_content)
end
end
user.rb
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
before_create :default_image
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
validates :introduction, presence: false, length: { maximum: 50 } # 自己紹介の最高文字数は50文字
has_one_attached :image
def default_image
if !self.image.attached?
self.image.attach(io: File.open(Rails.root.join('app', 'assets', 'images', 'デフォルト.png')), filename: 'default-image.png', content_type: 'image/png')
end
end
#validates :image, content_type: { in: %w[image/jpeg image/gif image/png],
#message: "有効なフォーマットではありません" },
#size: { less_than: 20.megabytes, message: " 20MBを超える画像はアップロードできません" }
def posts
return Post.where(user_id: self.id)
end
has_many :follower, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy
has_many :followed, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy
has_many :following_user, through: :follower, source: :followed # 自分がフォローしている人
has_many :follower_user, through: :followed, source: :follower # 自分をフォローしている人
# ユーザーをフォローする
def follow(user_id)
follower.create(followed_id: user_id)
end
# ユーザーのフォローを外す
def unfollow(user_id)
follower.find_by(followed_id: user_id).destroy
end
# フォローしていればtrueを返す
def following?(user)
following_user.include?(user)
end
has_many :posts, dependent: :destroy
has_many :comments, dependent: :destroy
end
補足情報
ruby 3.1.2p20
Rails 7.0.4
0