mame_haru
@mame_haru

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

新規投稿画面で作成を押すと値は入っているのに保存されない

解決したいこと

Ruby on Rails6.0でチャットアプリを作成しています。
チャットルーム新規作成画面で値を入れたのに保存されず新規作成画面に戻ってしまうエラーに悩んでいます。

発生している問題・エラー

新規作成画面でチャットルームとメンバーを入力し、作成するを押すと新規作成画面に戻されてしまう。またMySQLのデータベースにも保存されていない。

該当するソースコード

room controller↓

room.rb
class RoomsController < ApplicationController
  def index
  end

  def new
    @room = Room.new
  end

  def create
    @room = Room.new(room_params)
    if @room.save
      redirect_to root_path
    else
      render :new
    end
  end

  private
  def room_params
    params.require(:room).permit(:name, user_ids:[])
  end
end

新規投稿画面のview↓

new.html.erb
div class='chat-room-form'>
  <h1>新規ルーム作成</h1>
  <%=form_with model: @room, local: true do |f|%>

   <%= render "shared/error_messages", model: f.object %>

    <div class='chat-room-form__field'>
      <div class='chat-room-form__field--left'>
        <%= f.label :部署名, class: 'chat-room-form__label'%>
      </div>
      <div class='chat-room-form__field--right'>
        <%= f.text_field :name, class: 'chat__room_name chat-room-form__input', placeholder: '部署名を入力してください'%>
      </div>
    </div>
    <div class='chat-room-form__field'>
    </div>
    <div class='chat-room-form__field'>
      <div class='chat-room-form__field--left'>
        <label class='chat-room-form__label' for='chat_room_チャットメンバー'>部署先</label>
      </div>
      <div class='chat-room-form__field--right'>
       <select name="room[user_ids][]">
         <option value="">チャットする部署を選んで下さい</option>
         <% User.where.not(id: current_user.id).each do |user| %>
         <option value=<%= user.id %>><%= user.name %></option>
         <% end %>
        </select>
        <input name="room[user_ids][]" type="hidden" value=<%= current_user.id %>>
      </div>
    </div>
    <div class='chat-room-form__field'>
      <div class='chat-room-form__field--left'></div>
      <div class='chat-room-form__field--right'>
        <%= f.submit "ルーム作成", class: 'chat-room-form__action-btn'%>
      </div>
    </div>
  <% end %>
</div>

model↓

room.rb
class Room < ApplicationRecord
  has_many :room_users
  has_many :users, through: :room_users
  has_many :messages

  validates :name, presence: true
end

自分で試したこと

ターミナルでroom_paramsに格納されているのか確認した

ターミナル
    9: def create
 => 10:   binding.pry
    11:   @room = Room.new(room_params)
    12:   if @room.save
    13:     redirect_to root_path
    14:   else
    15:     render :new
    16:   end
    17: end

[1] pry(#<RoomsController>)> room_params
=> <ActionController::Parameters {"name"=>"テストチャット", "user_ids"=>["5", "3"]} permitted: true>

通信状態は大丈夫か確認した

ターミナル
[2] pry(#<RoomsController>)> exit
  User Load (0.6ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IN (5, 3)
  ↳ app/controllers/rooms_controller.rb:11:in `create'
  Rendering rooms/new.html.erb within layouts/application
  Rendered shared/_error_messages.html.erb (Duration: 0.3ms | Allocations: 142)
  User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` != 3
  ↳ app/views/rooms/new.html.erb:24
  Rendered rooms/new.html.erb within layouts/application (Duration: 2.9ms | Allocations: 1480)
[Webpacker] Everything's up-to-date. Nothing to do
Completed 200 OK in 57049ms (Views: 14.0ms | ActiveRecord: 1.3ms | Allocations: 31051)

通信状態はよくてparamsにはきちんと格納されていて値としては入っているはずなのにデータベースに保存されない原因が突き止められませんでした。
よろしくお願いいたします。

0

1Answer

debug で、コントローラの12行目(save)を通過した後でモデルはどうなっていますか?
エラーになってたりはしませんか?

0Like

Comments

  1. @mame_haru

    Questioner

    @atm-snag様ご回答ありがとうございます。
    binding.pryをかけたところ
    確かにfalseが出ました

    9: def create
    10:
    11: @room = Room.new(room_params)
    12:
    13: if @room.save
    14:
    15: redirect_to root_path
    16: else
    17: render :new
    18: end
    => 19: binding.pry
    20: end

    [1] pry(#<RoomsController>)> @room.save
    => false
    [2] pry(#<RoomsController>)>

    ということはparamsとして受け取ってはいるけど弾かれているということでしょうか?
    だとしたら、弾くような記述はroomモデルにはしていないのになんででしょうか?
    質問を重ねてしまい申し訳ありません。よろしくお願い致します。
  2. @mame_haru

    Questioner

    追記
    @room.errorsの結果です
    [2] pry(#<RoomsController>)> @room.errors
    => #<ActiveModel::Errors:0x00007fa1bb7c28d8
    @base=#<Room:0x00007fa1bb7112e0 id: nil, name: "新規チャット", created_at: nil, updated_at: nil>,
    @details={:users=>[{:error=>:invalid}, {:error=>:invalid}]},
    @messages={:users=>["translation missing: ja.activerecord.errors.models.room.attributes.users.invalid"]}>
  3. エラーを貼ってもらえてありがたいです.

    `validte users` がエラーになっているように読めます.

    `Room` モデルの `users` 辺りの制約にひっかかってるのではないでしょうか?
  4. @mame_haru

    Questioner

    @atm-snag様
    お返事ありがとうございます。
    アドバイス通りuserモデルの以下の制約を外したらtureになりました❗️
    直近の記憶を思い出してこの制約をかけていました。
    PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze
        validates_format_of :password, with: PASSWORD_REGEX, message: 'Include both letters and numbers'
    これはパスワードを設定するときに英字と数字であることの制約でした。
    passwordを設定するときのみに制約をかけていたつもりだったのでここまで及んでくるとはとても意外でした。
    なんでかは自分で調べていこうと思います。
    ありがとうございました❗️
  5. 解決したなら良かったです

Your answer might help someone💌