前提・実現したいこと
現在Rails6でWebアプリを作成しています。
ユーザーのプロフィール(users/show)にアイコン画像とバックグラウンド画像を表示するために、Userテーブルに関連付けたUser_imageテーブル作成し、そこから画像を取得しようと試みたところActionViewエラーが出ました。
発生している問題・エラーメッセージ
ActionView::Template::Error: undefined method `background?' for nil:NilClass
該当のソースコード
app/views/users/show.html.erb
<% provide(:title, @user.name) %> <section class="bg-white text-center"> <header class="relative"> <div class="xl:mb-20 sm:mb-24"> <% if @user_image.background? %> <%= image_tag @user_image.background.medium.url, class: img_background %> <% else %> <%= image_tag ("icons8-man-60.png"), class: img_background %> <% end %> </div> <div class="sm:-mt-7 -ml-20 top-3/4 left-1/2 absolute"> <% if @user_image.icon? %> <%= image_tag @user_image.icon.small.url, class: img_avatar %> <% else %> <%= image_tag ("icons8-man-60.png"), class: img_avatar %> <% end %> </div> </header> <div class="p-4"> <h1 class="mb-3 text-lg font-medium opacity-80"><%= @user.name %></h1> <p class="text-sm opacity-60">神奈川県</p> <div class="opacity-60"> <ul class="flex justify-center"> <li class="p-4 m-4">フォロー<span class="block font-medium">0</span></li> <li class="p-4 m-4">フォロワー<span class="block font-medium">0</span></li> </ul> </div> </div> </section>
app/models/user_image.rb
class UserImage < ApplicationRecord belongs_to :user validates :user_id, presence: true mount_uploader :icon, ImagesUploader mount_uploader :background, ImagesUploader end
app/models/user.rb
class User < ApplicationRecord has_one :user_image accepts_nested_attributes_for :user_image, update_only: true attr_accessor :remember_token before_save { email.downcase! } validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: true has_secure_password validates :password, presence: true, length: { minimum: 8 }, allow_nil: true def User.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end def User.new_token SecureRandom.urlsafe_base64 end def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end def authenticated?(remember_token) return false if remember_digest.nil? BCrypt::Password.new(remember_digest).is_password?(remember_token) end def forget update_attribute(:remember_digest, nil) end end
app/controllers/users_contorollers.rb
class UsersController < ApplicationController before_action :logged_in_user, only: [:edit, :setting, :update] before_action :correct_user, only: [:edit, :setting, :update] def new @user = User.new @user_image = @user.build_user_image end def show @user = User.find(params[:id]) @user_image = @user.user_image end def create @user = User.new(user_params) if @user.save log_in @user flash[:success] = "会員登録しました。 ようこそ! こだわりGEARS -俺のキャンプ自慢- へ!" redirect_to @user else render 'new' end end def edit @user = User.find(params[:id]) end def setting @user = User.find(params[:id]) end def update @user = User.find(params[:id]) if @user.update(user_params) redirect_to @user else render 'edit' end end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation, user_image_attributes: [:icon, :background]) end def logged_in_user unless logged_in? store_location flash[:danger] = "ログインしてください。" redirect_to login_url end end def correct_user @user = User.find(params[:id]) redirect_to(root_url) unless current_user?(@user) end end
試したこと
テーブルの関連付けが間違っているのかと思い、公式ドキュメントを含むテーブルの関連付けに関する記述に一通り目を通しましたが、やはり原因がわかりませんでした。
お忙しいところ大変恐縮ですが、ご教授いただければ幸いです。
補足情報(FW/ツールのバージョンなど)
Rails 6.1.4
Ruby 2.6.3
CarrierWave 2.2.2
MiniMagick 4.11.0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。