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

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

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

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

Ruby

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

Q&A

解決済

2回答

1179閲覧

チェックボックスを使った、多対多の保存

pancho

総合スコア12

Ruby on Rails 5

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

Ruby

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

0グッド

2クリップ

投稿2020/03/27 08:12

編集2020/03/28 04:15

前提・実現したいこと

社内ToDoアプリを作成中です
user(社員)がboard(情報を載せる所)を作った後
そのboardを共有できる人を選択するのに
チェックボックスを使った、多対多の保存を行おうとしたのですが
下記エラーがでて進めなくなりました。

中間テーブルとして、roomを作っています。

発生している問題・エラーメッセージ

イメージ説明

該当のソースコード

rooms_controller

 def new @board = Board.find_by(id: params[:board_id]) @room = Room.new end def create @room = Room.new(room_params) if @room.save flash[:success] = 'チームができました。メンバーを選んでください。' redirect_to @room else flash[:danger] = 'チームの作成に失敗しました。' render :new end end  private def room_params params.require(:room).permit(:board_id, { user_ids: [] } ) end

View/room/new

<h1>共有者の選択</h1> <%= form_with(model: @room, local: true) do |f| %> <%= f.hidden_field :board_id, :value => @board.id %> <%= f.collection_check_boxes :user_ids, User.all, :id, :name %> <%= f.submit '作 成', class: 'btn btn-primary btn-block' %> <% end %>

追加情報

user

class CreateUsers < ActiveRecord::Migration[5.2] def change create_table :users do |t| t.string :name t.string :email t.string :password_digest t.references :department, foreign_key: true t.boolean :admin, default: false t.timestamps end end end
class User < ApplicationRecord before_save { self.email.downcase! } validates :name, presence: true, length: { maximum: 10 } validates :email, presence: true, length: { maximum: 255 }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i }, uniqueness: { case_sensitive: false } has_secure_password belongs_to :department has_many :boards, through: :rooms has_many :rooms has_many :logs, dependent: :destroy end

board

class CreateBoards < ActiveRecord::Migration[5.2] def change create_table :boards do |t| t.string :name, null: false t.references :user, foreign_key: true t.string :release t.timestamps end end end
class Board < ApplicationRecord has_many :users, through: :rooms has_many :rooms has_many :lists, dependent: :destroy end

room(中間テーブル)

class CreateRooms < ActiveRecord::Migration[5.2] def change create_table :rooms do |t| t.references :user, foreign_key: true t.references :board, foreign_key: true t.timestamps t.index [:user_id, :board_id], unique: true end end end
class Room < ApplicationRecord belongs_to :user belongs_to :board end

試したこと

user_idsの所でエラーが出ているようなので文字の書き間違いがないかなどは調べて回り
_idsのsかとも思ったのですが
view,controller共にsを消すと
別のエラーが出てしまいます。

イメージ説明

補足情報(FW/ツールのバージョンなど)

開発環境
AWS9
Rails5.2.4.1

プログラミング歴
6ヶ月

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

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

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

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

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

guest

回答2

0

自己解決

解決したので方法を載せます。
まず、当初の方法(board(情報を載せる所)を作った後、boardを共有できる人を選択する)
ではなく、boardを作る時に共有者を選択する方法に切り替えました。

https://programming-beginner-zeroichi.jp/articles/25
上記サイトを参考に
board/newを

<%= form_with(model: @board, local: true) do |f| %> <% if @board.errors.any? %> <div id="error_explanation"> <ul> <% @board.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <div class="form-group"> <%= f.label :name, 'ボードの名前' %> <%= f.text_field :name, class: 'form-control' %> </div> <%= f.hidden_field :user_id, value: current_user.id %> <%= f.submit '作 成', class: 'btn btn-primary btn-block' %> <% end %>

から↓に変更

<%= form_with(model: @board, local: true) do |f| %> <% if @board.errors.any? %> <div id="error_explanation"> <ul> <% @board.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <div class="form-group"> <%= f.label :name, 'ボードの名前' %> <%= f.text_field :name, class: 'form-control' %> </div> <div class="form-group"> <%= f.label :user, 'このボードを共有する人を選んでください?' %></br> <%= f.collection_check_boxes(:user_ids, User.all, :id, :name, include_hidden: false) %> </div> <%= f.submit '作 成', class: 'btn btn-primary btn-block' %> <% end %>

controller_boardを

def new @board = Board.new end def create @board = Board.new(board_params) if @board.save flash[:success] = 'ボードが出来ました。' redirect_to @board else flash[:denger] = 'ボードの作成に失敗しました。' render :new end end private def board_params params.require(:board).permit(:name, user_id) end

から↓に変更

def new @board = Board.new @board.rooms.build end def create @board = Board.new(board_params) if @board.save flash[:success] = 'ボードが出来ました。' redirect_to @board else flash[:denger] = 'ボードの作成に失敗しました。' render :new end end private def board_params params.require(:board).permit(:name, { user_ids: [] }) end

上記変更で多対多の保存が出来ました。

投稿2020/04/01 01:01

pancho

総合スコア12

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

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

0

form_with(model: @room, になっています。
ですが多対多ですから user_id があるのは room ではなく中間tableでしょう。
なので、Roomにはuser_idsないよ、と言われてます。
paramsの構成変わりますがform_with(model: :user, にしてf.collection_check_boxes :ids,にするのかな。

form_with(model: @room, のままだとすると
f.field_for :room_users do |fr| fr.collection_check_boxes :user_ids,
あたりかも

投稿2020/03/28 01:45

winterboum

総合スコア23347

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

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

pancho

2020/03/28 04:11

バタバタとUPしたので情報が足りませんでした。 roomはuserとboardを繋ぐ中間テーブルとなってます。
pancho

2020/04/01 01:03

回答ありがとうございました。 最終的に違う方法で解決しましたが、今後の参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問