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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

Q&A

0回答

1012閲覧

【rails】ふたつのテーブルからid情報を引っ張り保存したい

myu00

総合スコア0

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

1グッド

2クリップ

投稿2022/03/07 05:08

初学者です。掲題で何日もつまづいてしまい、ご教示いただけましたら幸いです。

【状況】
・宿泊予約のアプリを作成している
・ログインユーザに、ホテルの【登録】と【予約】、両方できるようにしたい。
・登録機能は実装できたが、【予約】機能の方で、「誰が予約したか(user_id)」と「どこを予約したか(stayhotel_id)」の情報を持たせるにあたりエラー(?)が発生しており解消できない。

【エラー内容】
画像の説明をここに入力
理想としては、stayhotel_idに'4'、user_id(ログイン中のid)に'2'を格納できれば良いのですが、ユーザidがうまく反映されていないように感じました。

ログイン機能にはdeviseを利用しています。
devise利用時のログインユーザ(id)はcurrent_idで持ってこれると知り、
createを下記のように書いてみたり、色々と試行錯誤したのですが、うまく保存できません。。

ルートの書き方も怪しいと思い調べていますが、、(内容は下部に記載)
暗中模索の状態が続いており、理解が浅く恐縮ですが、考えうる原因と解消方法を
具体的にご教示いただけましたら大変助かります。。
どうぞよろしくお願いいたします。

【Reservationsコントローラ】

class ReservationsController < ApplicationController def new @reservation = Reservation.new end def create stayhotel = Stayhotel.find(params[:id]) @reservation =stayhotel.reservations.new(reservation_params) @reservation.user_id = current_user.id @reservation.save redirect_to reservation_path(@reservation) end private def reservation_params params.require(:reservation).permit(:start, :close, :nop) end end

なお、予約ではなく、ホテルを登録する場合 は下記の書き方でログイン中のユーザidを保存できました。
※stayhotelのコントローラ▼

def new @stayhotel = Stayhotel.new end def create @stayhotel = Stayhotel.new(stayhotel_params) @stayhotel.user_id = current_user.id @stayhotel.save redirect_to stayhotel_path(@stayhotel) end

【view】

  <h1>予約フォーム</h1> <%= form_with model: @reservation.stayhotel do |f| %> <%= f.label :start %> <%= f.date_field :start %> <%= f.label :close %> <%= f.date_field :close %> <%= f.label :nop %> <%= f.number_field :nop %> <%= f.submit %> <% end %>

【モデル】
・アカウント情報(User.rb)
・ホテル情報(stayhotel.rb)
・予約情報(Reservation.rb)

reservationテーブルはuserstayhotelを紐づける中間テーブルとしています

class Reservation < ApplicationRecord belongs_to :user belongs_to :stayhotel end

【各テーブルの中身】

create_table "reservations", force: :cascade do |t| t.integer "user_id" t.integer "stayhotel_id" t.string "start" t.string "close" t.integer "nop" t.bigint "sum_price" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "stayhotels", force: :cascade do |t| t.integer "user_id" t.string "room_title" t.text "room_intro" t.bigint "room_price" t.string "room_adress" t.string "room_image_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.string "username", default: "", null: false t.string "profile_image_id" t.text "profile" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end

【ルーティング】

Rails.application.routes.draw do root to: "home#index" devise_for :users resources :users resources :stayhotels do member do resources :reservations end end post 'stayhotels/:id/reservations/new', to: 'reservations#new' end

※最後のpost〜は、予約機能を実装している時にpostがないよとエラー表示されたので追加した一文です。
※menber do は[どのホテルを開いているのか]わかりやすく表示(/stayhotels/:id/reservations/:id)できればと記載してみました

shinoharat👍を押しています

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問