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

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

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

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

695閲覧

[Rails6]Userテーブルに関連付けたUser_imageテーブルから画像を取得できない

asayuki

総合スコア0

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/09/16 01:39

編集2021/09/16 01:44

前提・実現したいこと

現在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

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

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

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

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

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

guest

回答1

0

ruby

1@user_image = @user.user_image

@user に関連付けられた UserImage が空だと @user_image は nil になります。
nil に background? を呼んでいるのでエラーになります。

@user_image が空の @user はすべてエラーになるので、
そうならないように @user_image が nil じゃないかチェックします。

erb

1 <% if @user_image && @user_image.background? %>

この @user は絶対に user_image があるはずんだけど!という場合は、
コンソールに bin/rails c として User.find(id).user_image とするか、
UserImage.where(user_id: id) としてもう一度確認してみてください。

投稿2021/09/16 10:24

neko_daisuki

総合スコア2090

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問