初学者です。掲題で何日もつまづいてしまい、ご教示いただけましたら幸いです。
【状況】
・宿泊予約のアプリを作成している
・ログインユーザに、ホテルの【登録】と【予約】、両方できるようにしたい。
・登録機能は実装できたが、【予約】機能の方で、「誰が予約したか(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テーブルはuserとstayhotelを紐づける中間テーブルとしています
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)できればと記載してみました
あなたの回答
tips
プレビュー