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

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

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

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

Q&A

解決済

1回答

329閲覧

form_forから中間テーブルへレコードの保存ができない

ikdnaht

総合スコア13

Ruby on Rails 5

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

0グッド

0クリップ

投稿2020/01/13 02:09

前提・実現したいこと

Rails初学者です。
現在Railsにて、スポーツの練習相手をマッチングさせるアプリを作成中です。
スポーツイベントの詳細ページから、ユーザーは参加予定の宣言ができて、参加予定のユーザ,ー同士をマッチングさせる機能を実装したいです。

・event
・user
・event_user

上記の、3テーブルをアソシエーションさせて、userがeventに参加予定の場合は、event_userテーブルにuser_idとevent_idが保存されるようにしたいのですが、form_forからうまく保存させることができず、解決ができません。(consoleからは入力可能です)

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

ActionController::ParameterMissing in EventsController#update param is missing or the value is empty: event

イメージ説明

該当のソースコード

app/views/events/show.html.haml

haml

1%div.event_detail 2 %div.event_detail__title 3 イベント詳細 4 = image_tag @event.image.url, class: "event_detail__image" 5 %div.event_detail__info_box 6 %ul.event_detail__info_box--list 7 %li.event_detail__info_box--name 8 = @event.name 9 %li.event_detail__info_box--text 10 日にち : 11 = @event.date 12 %li.event_detail__info_box--text 13 開始時間: 14 = @event.time 15 %li.event_detail__info_box--text 16 場所  : 17 = @event.place 18 %div.event_detail__join_btn 19 = form_for @event do |f| 20 = hidden_field_tag :id, @event.id 21 = hidden_field_tag :user_ids, current_user.id 22 = f.submit "参加する"

app/config/routes.rb

Rails.application.routes.draw do root "events#index" devise_for :users resources :users do member do get :following, :followers end end resources :relationships, only: [:create, :destroy] resources :events, only: [:index, :new, :create, :show, :update] resources :matching, only: [:index] get '/user/like', to: 'matching#like', as: :like get '/user/liked', to:'matching#liked', as: :liked end

app/controllers/event_controller.eb

class EventsController < ApplicationController def index @events = Event.all.order(date: :asc) end def new @events = Event.new @events.users << current_user end def create @event = Event.new(event_params) if @event.save redirect_to root_path else render :new end end def show @event = Event.find(params[:id]) end def edit @event = Event.find(params[:id]) end def update @event = Event.find(params[:id]) @event.update(event_params) end private def event_params params.require(:event).permit(:image, :name, :date, :time, :place, user_ids: []) end end

app/models/user.rb

class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :event_users, dependent: :destroy has_many :events, through: :event_users has_many :active_relationships, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy has_many :passive_relationships, class_name: "Relationship", foreign_key: "following_id", dependent: :destroy has_many :following, through: :active_relationships has_many :followers, through: :passive_ralationships, source: :follower def following?(other_user) following.include?(other_user) end def matchers User.where(id: passive_relationships.select(:follower_id)) .where(id: active_relationships.select(:following_id)) end end

app/models/event.rb

class Event < ApplicationRecord mount_uploader :image, ImageUploader has_many :event_users, dependent: :destroy has_many :users, through: :event_users end

app/models/event_user.rb

class EventUser < ApplicationRecord belongs_to :event belongs_to :user end

試したこと

エラー文より、paramsに情報が入っていないのかと思い、binding.pryをしてみたのですが、paramsには情報が入っているようでした。

34: def event_params => 35: binding.pry 36: params.require(:event).permit(:image, :name, :date, :time, :place, user_ids: []) 37: end [1] pry(#<EventsController>)> params => <ActionController::Parameters {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"Mz6cqDHZDv3l5pYCDJBSOOWSJfVGmzQYMeiotdxesa54ltJTO/hufo8pdnwuJS7253VSS/orOo6MXfs/WyU2lA==", "id"=>"17", "user_ids"=>"13", "commit"=>"参加する", "controller"=>"events", "action"=>"update"} permitted: false>

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

rails 5.2.3
ruby 2.5.1
ユーザー登録はdeviseを使っています

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

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

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

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

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

guest

回答1

0

ベストアンサー

二つ問題があります。
1)今のエラー
2)エラーがなおっても EvenUserは作られない

今のエラーは、#updateに 「params[:event]が送られてきていない。もしくは空」 というエラーです。
formには hidden_field_tag が使われ、f.hidden_field でないため、params[:event] はないでしょう。
あと、user_idsになっていますが、送られるのは一つなので user_id とすべきです。
かつ、そのuserはcurrent_userだから送る必要はありません。
ということで formのなかは
= hidden_field_tag :id, @event.idだけにし、
updateにて

@event = Event.find(params[:id]) @event.create_event_users(user_id: current_user.id)

とすればよいです。

ただし

これでは Eventの修正が出来ません。updateはeventの修正に使うべき。
なので、 (例えば) join というactionを追加してそこで処理したほうが良いでしょう。

投稿2020/01/13 02:37

winterboum

総合スコア23329

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

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

ikdnaht

2020/01/13 07:54 編集

ご回答いただきありがとうございます! ●app/controllers/event_controller 内に、下記を追加。 def join @event = Event.find(params[:id]) @event.create_event_users(user_id: current_user.id) end ●app/views/events/show.html.haml 内を下記のように修正。 %div.event_detail__join_btn = form_for @event,:url => {controller: "events", action: "join"} do |f| = hidden_field_tag :id, @event.id = f.submit "参加する" ●app/config/routes.rb 内を下記のように修正。 resources :events do member do get :join end end resources :events, only: [:index, :new, :create, :show, :update] してみたのですが、以下のようなエラーが発生しております。 中間テーブルにidを登録するための記述に誤りがあるということでしょうか? NoMethodError in EventsController#join undefined method `create_event_users' for #<Event:0x00007fc2ad617980> Did you mean? created_at_was def join @event = Event.find(params[:id]) @event.create_event_users(user_id: current_user.id) ※この行が赤く塗られています end
winterboum

2020/01/13 08:01

ごめん間違えた @event.create_event_users(user_id: current_user.id) でなく @event.event_users.create(user_id: current_user.id)
ikdnaht

2020/01/13 08:52

表示されるようになりました! アクションを追加できることなど、周辺知識も含めて大変勉強になりました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問