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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

解決済

Rails6 accepts_nested_attributes_forにより、ネストした関連先のテーブルもまとめて保存したい。

YousukeTanaka
YousukeTanaka

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

1回答

0評価

0クリップ

8閲覧

投稿2020/01/27 06:40

編集2022/01/12 10:58

実現したいこと

Userテーブルと1対1の関係があるStudentテーブルがあり、どちらか一方が更新されれば、もう一方も更新されるようにしたい。
イメージ説明

問題点

以下、2点の問題が発生しています。
①Studentの入力部分が非表示になっている。
②以下のエラーが発生している。

そのために、Controller部分を確認し、フィードバックをいただけないでしょうか?

イメージ説明

Modelの記載

親:User.rb

class User < ApplicationRecord has_one :student, dependent: :destroy accepts_nested_attributes_for :student end

子:Student.rb

class Student < ApplicationRecord belongs_to :user, optional: true, inverse_of: :student end

Table構造

Usersテーブル create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "fullname" t.integer "unread", default: 0 t.bigint "global_user_id" t.bigint "school_person_in_charge_id" t.bigint "student_id" t.index ["email"], name: "index_users_on_email", unique: true t.index ["global_user_id"], name: "index_users_on_global_user_id" t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true t.index ["school_person_in_charge_id"], name: "index_users_on_school_person_in_charge_id" t.index ["student_id"], name: "index_users_on_student_id" end

studentsテーブル

create_table "students", force: :cascade do |t| t.string "nickname" t.date "birth" t.integer "gender" t.string "image" t.text "comment" t.bigint "user_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["user_id"], name: "index_students_on_user_id" end

Controllerの記載

Profiles_controller.rb

class StudentAdmin::ProfilesController < StudentAdmin::StudentsController before_action :authenticate_user! def edit @user = current_user end def profile_update if current_user.student.nil? current_user.create_student!(profile_params) else current_user.student.update(profile_params) end redirect_to user_profile_path(current_user) end private def profile_params params.require(:user).permit(:fullname, :email, :avatar, student_attributes: [:id, :nickname, :birth, :gender, :comment, :user_id]) end end

Form(HTML)の記載

<%= simple_form_for(user, url: user_profile_update_path(current_user), method: :put, html:{ multipart: true }) do |f| %> //親テーブルの要素 <%= f.input :fullname, label: false, input_html: { value: current_user.fullname, class: "form-control" }, required: true, autofocus:true %> //子テーブルの要素=>この部分が全て表示されない状況です。 <%= f.simple_fields_for :student do |p| %> <%= p.input :nickname, label: false, required: true, autofocus: true, input_html: { class: "form-control"}, wrapper: false, label_html: { class: "label" } %> <%= p.input :comment, label: false, as: :text, required: true, autofocus: true, input_html: { class: "form-control", rows: 7}, wrapper: false, label_html: { class: "label" } %> <% end %> <%= f.button :submit, "Send", class: "btn btn-primary" %> <% end %>

上記の結果は、親テーブルの表示はできますが、子テーブルの表示ができない状況です。ただし、viewsの

<%= f.simple_fields_for :student do |p| %>

のstudentを"students"に変えた場合は、子要素の部分が表示されます。ただし、保存ができません。私自身は、controllerの書き方に問題があるのではないかと考えていますが、色々と試してみましたが、解決に至っていません。お知恵をお貸しいただけると幸いです。

補足情報

ruby 2.5.7p206
Rails 6.0.2.1
Deviseというgemを使って、User管理を行なっています。
form は、simple_formというgemを使っています。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

winterboum
winterboum

2020/01/29 21:33

viewが長いので、読み解くのが面倒でパスしちゃってました。 親テーブルの表示 は どの部分 子テーブルの表示 は どの部分 子テーブルの表示ができない とは、その部分が全く無いのか、データが無いのか を教えてください User、Student の table構成(migration) を載せてください
YousukeTanaka
YousukeTanaka

2020/01/31 07:13

winterboum様。コメントありがとうございます。ご指摘に従い、情報を追加いたしました。 >子テーブルの表示ができない とは、その部分が全く無いのか、データが無いのか 子テーブルの要素の表示が全てできていない状態となります。 お手を煩わせてしまい、申し訳ございませんが、ご助言により方向性が見えてくれば嬉しい限りです。よろしくお願いいたします。
winterboum
winterboum

2020/01/31 07:19 編集

子テーブルの要素の表示が全てできていない と言うのは、表示すべきの場所にその枠はあるのだがデータがない という意味ですか? ああ、要素とはhtml要素かわかりました form全体は消しちゃったんですね。 それ復活してください。
YousukeTanaka
YousukeTanaka

2020/01/31 07:34

承知しました。元のコードに戻しました。もし、今回の解決が難しい場合、他の解決も模索したいと思っています。その場合、そもそも、accepts_nested_attributes_forの使用そのものにも疑問を持ちながら、使っており、こちらもご相談できればとおもています。過去の投稿にもありますし、googleでも調べるとあまり推奨されているコードではないと認識しております。これに変わるやり方も調べたのですが、複雑で理解できず、accepts_nested_attributes_forを使っておりました。もし、参考になるドキュメントがございましたら、教えていただけないでしょうか?

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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