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

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

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

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

Q&A

1回答

1962閲覧

設定していないバリデーションにより保存できません

yama120

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/09 06:42

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

belongs_to するとRailsが設定するvalidationがあります。
例えば belongs_to :user ですと

  1. user_id が入力されていること
  2. そのuser_idをもつUserが有ること

1)は optional: true で回避できますが
2)は回避できません。
実在しないuser_idが渡っていないか確認してください

投稿2020/11/09 10:06

winterboum

総合スコア23347

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問