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

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

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

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

2回答

1200閲覧

【Ruby on Rails】中間テーブルの更新方法について

tomm

総合スコア3

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

1グッド

1クリップ

投稿2022/12/22 08:12

前提

【環境】
開発環境 Windows10
Ruby バージョン ruby 3.0.4p208 (2022-04-12 revision 3fa771dded) [x64-mingw32]
rails バージョン Rails 7.0.4

railsチュートリアルのコードをベースにして社員マスタを作成しております。
下図の「社員情報」と「部署名称」及び「在籍期間」を保持した部署履歴(中間テーブル)を作成し、
ユーザ新規作成、編集時に同テーブルを更新したいと考えております。

イメージ説明

実現したいこと

ユーザ編集時に、部署テーブルを必要に応じて追加するようにしたい。

該当のソースコード

user_controller.rb

ruby

1class UsersController < ApplicationController 2 def new 3 @user = User.new 4 #bushoを相互登録するため追加↓ 5 @user.user_bushos.new 6 end 7<省略> 8 def edit 9 @user = User.find(params[:id]) 10 #bushoを相互登録するため追加↓ 11 @user.user_bushos.new 12 end 13<省略>

user.rb

ruby

1class User < ApplicationRecord 2 has_many :user_bushos 3 accepts_nested_attributes_for :user_bushos, allow_destroy: true 4 has_many :bushos, through: :user_bushos 5<省略>

_user_inffo.html.erb ※users/new、edit.html.erbからレンダリング

ruby

1 <%= form_with model: @user do |f| %> 2<省略> 3 <%= f.fields_for :user_bushos do |ub| %> 4 <% i = 1 %> 5 <div class="form-group row"> 6 <div class="col-md-1 offset-md-3"> 7 <%= ub.label :busho_id, "部署 #{i}" %><br> 8 <%= ub.collection_select :busho_id, 9 Busho.all, 10 :id,:busho_name, 11 class: 'form-select' %> 12 </div> 13 <div class="col-md-2"> 14 <%= f.label :addbusho_date, "所属開始" %><br> 15 <%= ub.date_field :addbusho_date, class: 'form-control' %> 16 </div> 17 <div class="col-md-2"> 18 <%= f.label :delbusho_date, "所属終了" %><br> 19 <%= ub.date_field :delbusho_date, class: 'form-control' %> 20 </div> 21 </div> 22 <% i += 1 %> 23 <% end %> 24<省略> 25 <% end %>

現状

現状は以下画面の通り、ユーザ編集の都度に部署履歴(中間テーブル)が追加される状況になります。
イメージ説明

お力添えいただけると幸いです。

shinoharat👍を押しています

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

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

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

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

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

guest

回答2

0

以下を参考にして、cocoonを導入、動的に更新が可能になりました。
https://qiita.com/List202/items/2ad3ddac76e0bf98116d

※Rails7の仕様なのか、、「app/javascript/src/cocoon.js」を作成、インポートしないと以下と同様の症状に陥りました。
https://stackoverflow.com/questions/71645732/cocoon-gem-issue-in-rails-7

ユーザフォームは以下のような形で実装しました。

_user_info.html.erb

ruby

1<%# 部署追加 %> 2 <%= f.fields_for :user_bushos do |ub| %> 3 <%= render "user_busho_fields", f: ub, 4 class: 'btn btn-success' %> 5 <% end %> 6 <div class="links"> 7 <%= link_to_add_association "部署を追加", f, :user_bushos, 8 class: 'btn btn-success', 9 data: { 10 force_non_association_create: true, 11 association_insertion_method: 'before' } 12 %> 13 </div>

_user_busho_fields.html.erb

ruby

1<div class="nested-fields"> 2 <div class="field"> 3 <%= f.label :busho_id, "部署" %><br> 4 <%= f.collection_select :busho_id, 5 Busho.all, 6 :id,:busho_name, 7 class: 'form-select' %> 8 </div> 9101112 <%= link_to_remove_association "削除", f, 13 class: 'btn btn-danger col-md-2 ' %> 14 </div> 15</div>

ユーザ情報をeditした際に、常に「_user_busho_fields.html.erb」が新規挿入された形で
ページ生成されますので、デフォルトでは生成されないような方法を模索しております。

一旦動的なフォーム生成はできましたので、本件クローズとさせていただきます。
ありがとうございました!

投稿2022/12/26 04:47

編集2022/12/26 04:50
tomm

総合スコア3

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

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

tomm

2022/12/28 09:05 編集

追記 >ユーザ情報をeditした際に、常に「_user_busho_fields.html.erb」が新規挿入された形で >ページ生成されますので、デフォルトでは生成されないような方法を模索しております。 user_controller.erb を以下の通りに変更、想定する挙動となりました。 ```ruby def new @user = User.new #bushoを相互登録するため追加↓ @user.user_bushos.build end def edit @user = User.find(params[:id]) end ```
no1knows

2022/12/28 22:33

ちょっと質問の意図を理解できているかわからないのと、解決済みとのことなので参考までに・・・ Railsであれば中間テーブルを保存する場合、アソシエーション(has_many、has_many through、belongs_to)とcontrollerのpermitにidsを設定するだけで簡単に実装できます。 https://www.youtube.com/watch?v=0etvUj34Wqw accepts_nested_attributes_forやgemなどを利用しなくてもシンプルな実装が可能となっています。
guest

0

ベストアンサー

gem cocoon を追加してはいかがでしょう?
https://github.com/nathanvda/cocoon

投稿2022/12/23 01:27

shinoharat

総合スコア1676

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

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

tomm

2022/12/23 08:56

ありがとうございます! 試してみて、こちらに結果を追記するようにいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問