前提・実現したいこと
roomsテーブルの保存ができない。
roomの保存をすると、バリデーションで設定していないはずのUsers is invalidというバリデーションにより保存できない。
roomsテーブルとusersテーブルはroom_usersテーブルを介して関連づけています。
発生している問題・エラーメッセージ
pry(#<RoomsController>)>@room.save! ActiveRecord::RecordInvalid: Validation failed: Users is invalid from /Users/yamazakihiiragiware/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.4/lib/active_record/validations.rb:80:in `raise_validation_error'
該当のソースコード
rooms/new/html.erb
ruby
1<div class='chat-room-form'> 2 <h1>ルーム</h1> 3 <%=form_with model: @room, local: true do |f|%> 4 5 <%= render 'shared/error_messages', model: f.object %> 6 7 <div class='chat-room-form__field'> 8 <div class='chat-room-form__field--left'> 9 <%= f.label :チーム名, class: 'chat-room-form__label'%> 10 </div> 11 <div class='chat-room-form__field--right'> 12 <%= f.text_field :team_name, class: 'chat__room_name chat-room-form__input', placeholder: 'チーム名を入力してください'%> 13 </div> 14 </div> 15 <div class="room_form_field"> 16 <div class="room_form_field_left"> 17 <%= f.label :パスワード, class: 'room_form_label' %> 18 </div> 19 <div class="room_form_field_right"> 20 <%= f.password_field :password, class: 'room_name', placeholder: 'パスワードを入力してください' %> 21 </div> 22 </div> 23 <div class="room_form_field"> 24 <div class="room_form_field_left"> 25 <%= f.label :パスワード確認, class: 'room_form_label' %> 26 </div> 27 <div class="room_form_field_right"> 28 <%= f.password_field :password_confirmation, class: 'room_name', placeholder: 'もう一度パスワードを入力してください' %> 29 </div> 30 </div> 31 <div class='chat-room-form__field'> 32 </div> 33 34 <input name="room[user_ids]" type="hidden" value=<%= current_user.id %>> 35 36 <div class='chat-room-form__field'> 37 <div class='chat-room-form__field--left'></div> 38 <div class='chat-room-form__field--right'> 39 <%= f.submit class: 'chat-room-form__action-btn'%> 40 </div> 41 </div> 42 <% end %> 43</div> 44
rooms_controller.rb
ruby
1class RoomsController < ApplicationController 2 before_action :authenticate_user! 3 def index 4 @rooms = Room.all 5 end 6 7 def new 8 @room = Room.new 9 end 10 11 def create 12 @room = Room.new(room_params) 13 binding.pry 14 if @room.save 15 redirect_to root_path 16 else 17 render :new 18 end 19 end 20 21 private 22 23 def room_params 24 params.require(:room).permit(:team_name, :password, :user_ids) 25 end 26 27 28end 29
room.rb
ruby
1class Room < ApplicationRecord 2 has_many :room_users 3 has_many :users, through: :room_users, dependent: :destroy 4 has_many :messages, dependent: :destroy 5 6 7 has_secure_password 8 9 with_options presence: true do 10 validates :team_name 11 validates :password, format: { with: /\A[a-z\d]{8,100}+\z/i } 12 end 13end 14
user.rb
ruby
1class User < ApplicationRecord 2 PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze 3 validates :password, format: { with: PASSWORD_REGEX } 4 validates :nickname, presence: true 5 validates :position_id, numericality: { other_than: 1, message: "can't be blank" } 6 # Include default devise modules. Others available are: 7 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 8 devise :database_authenticatable, :registerable, 9 :recoverable, :rememberable, :validatable 10 11 extend ActiveHash::Associations::ActiveRecordExtensions 12 belongs_to :position, optional: true 13 14 has_many :room_users 15 has_many :rooms, through: :room_users 16 has_many :messages 17 has_many :events 18 19end 20
room_user.rb
ruby
1class RoomUser < ApplicationRecord 2 belongs_to :user, optional: true 3 belongs_to :room, optional: true 4end 5
試したこと
アソシエーションの問題と思い、belongs_toにoptional: trueを記述したが解決しなかった
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。