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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

708閲覧

has_one型のデータを表示させたい

hayatoganbaru

総合スコア7

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2021/07/29 12:04

編集2021/08/02 12:08

作成中のアプリケーション

ライブ情報を一覧表示できるアプリケーションを作成中です。
ユーザー新規登録をウィザード形式で、 ライブハウスの画像(active_storageで実装)、住所等を
mysqlに保存することができました。
ユーザー: admin_usersテーブル
住所、プロフィール等: admin_profilesテーブル

アソシエーション
admin_user has_one admin_profile
admin_profile belongs_to admin_user

解決したいこと

admin_userのshowアクションのビューであるshow.html.erbに
admin_profileの住所やライブハウスの画像(actice_strage)の情報を表示したいです。

admin_users_controllerに

class AdminUsersController < ApplicationController def show admin_user = AdminUser.find(params[:id]) @store_name = admin_user.store_name @admin_profile = admin_user.admin_profile end end

と記述し表示を試みましたが
NoMethodErrorとなりました。
また、コントローラーの
@admin_profileの前の行にbinding.pryを記述し、
@admin_profileとターミナルに入力すると
nilが帰ってきました。

どなたかcontrollerでどのように定義すると
has_one型のテーブルから値を取得することができるのか
お教え頂けないでしょうか?

追記

admin_users/show.html.erb

<p class="postal-code"> 〒 <%= @admin_profile.postal_code %> </p> <p class="prefecture-text"> <%= "都道府県" %><%= "市区町村" %>

上記の@admin_profile.postal_codeの箇所で
NoMethodError, undefined method `postal_code' for nil:NilClass
となっております。

モデルの関連付け

AdminUserモデル

class AdminUser < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable PASSWORD_REGGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze validates_format_of :password, with: PASSWORD_REGGEX validates :store_name, presence: true has_many :events has_one :admin_profile end

AdminProfileモデル

class AdminProfile < ApplicationRecord belongs_to :admin_user, optional: true has_one_attached :admin_image extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :prefecture with_options presence: true do validates :postal_code, format: { with: /\A[0-9]{3}-[0-9]{4}\z/ } validates :prefecture_id, numericality: { other_than: 1, message: "can't be blank" } validates :municipality validates :address validates :phone_number, format: { with: /\A\d{10,11}\z/ } validates :profile validates :admin_image end end

試したこと

ターミナルで

[1] pry(main)> AdminUser.pluck(:id) (0.3ms) SELECT `admin_users`.`id` FROM `admin_users` => [5, 16, 7, 14, 12, 15, 6, 8, 13, 1, 11, 9, 4, 18, 3, 17, 2, 10] [2] pry(main)> AdminProfile.pluck(:admin_user_id) (0.3ms) SELECT `admin_profiles`.`admin_user_id` FROM `admin_profiles` => [4, 6, 7, 13, 14, 15, 17, 18]

が確認できました。

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

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

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

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

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

maisumakun

2021/07/29 12:48

> NoMethodErrorとなりました。 どの行の何についてそのエラーが出ましたか?
hayatoganbaru

2021/07/29 20:13

追記・編集依頼ありがとうございます。 追記しました。 よろしければご確認いただけるとありがたいです。
guest

回答1

0

ベストアンサー

active_storage ということはRails ですね? tagに追加しておくのが良いかと。

で、
表示しようとしている AdminUser と 「それに関連しているつもりのDBに格納されたAdminProfile」が正しく関連付けされていない可能性があります。
可能性1 Prifileが違うAdminUserと関連していて、表示しようとしているAdminUserには関連が居ない
可能性2 関連付け情報が正しくない

まず2の方をみます。
アソシエーション
admin_user has_one admin_profile
admin_profile belongs_to admin_user
というつもりなのはわかりました。実際にどう定義したか、2つのmodelのcodeを載せてください。
そこが正しかったら1の調べ方を追記します。

投稿2021/08/01 20:57

winterboum

総合スコア23416

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

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

hayatoganbaru

2021/08/02 09:54

ご回答ありがとうございます。 ご指摘もありがとうございます。 確かにわかりにくいですね。 tagにrailsも追加しました。 2つのモデルについてです。 AdminUserモデル class AdminUser < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable PASSWORD_REGGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze validates_format_of :password, with: PASSWORD_REGGEX validates :store_name, presence: true has_many :events has_one :admin_profile end AdminProfileモデル class AdminProfile < ApplicationRecord belongs_to :admin_user, optional: true has_one_attached :admin_image extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :prefecture with_options presence: true do validates :postal_code, format: { with: /\A[0-9]{3}-[0-9]{4}\z/ } validates :prefecture_id, numericality: { other_than: 1, message: "can't be blank" } validates :municipality validates :address validates :phone_number, format: { with: /\A\d{10,11}\z/ } validates :profile validates :admin_image end end よろしければご確認いただけないでしょうか。
winterboum

2021/08/02 11:14

codeはコメントではなく質問欄を編集してそちらに移してください。 で、 belongs_to :admin_user, optional: true ですからつながってないものも出てきそうですね 可能性1を確認しましょう rails c を立ち上げて AdminUser.pluck(:id) AdminProfile.pluck(:admin_user_id) の結果を比較してください 及び AdminUser.find(params[:id]) の id の値も
hayatoganbaru

2021/08/02 12:16 編集

ターミナルの結果を質問欄を編集して追記しました。 外部キーのnilを許可するoptional: trueのせいでNoMethodError起こったのかなと思い、 admin_users_controllerのshowアクションに admin_user.id == admin_user.admin_profile.admin_user_idなら @admin_profileにadmin_user.admin_profileを代入する条件式を 追加してみました。 画面を確認すると admin_user_idに対してNoMethodErrorが生じました。 rails cでAdminUser.find(params[:id])を試してみましたが NameErrorが発生しました。
winterboum

2021/08/02 12:22

やっぱりProfileのないUserがいますね。 id が [1, 2, 3, 5, 8, 9, 10, 11, 12, 16] な AdminUserだとエラーになりますね。 profileのないのを許容するなら @admin_profile&.postal_code と & を入れましょう 許容しないなら、AdminUser の validation にAdminProfile をチェックしましょう
hayatoganbaru

2021/08/02 20:38

@admin_profile&.postal_codeと記述するとprofileのないadmin_userも エラーなく表示されるようになりました! admin_profileにActiveHashを用いて都道府県のデータを保存する カラム(prefecture_id)があります。 これを@admin_profile&.prefecture.nameと 記述するとprofileのないadmin_userではNoMethodErrorが発生してしまいます。
winterboum

2021/08/02 21:13

@admin_profile&.prefecture&.name
hayatoganbaru

2021/08/03 10:12

無事表示させることができました! また、active strageで保存したadmin_imageも 条件式を利用して実装に成功しました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問