(Ruby,Rails初学者)予約確認フォームでRoom.find(params[:id])がエラー、room_idを紐付けたい
Ruby、Rails初学者です。
初めてのお勉強開発(個人)で、宿泊予約サイトのようなものを作成しています。
予約確認フォームの部分でつまづいてしまい、
調べても分からずに困っているので、どなたかお助けください。。。
(投稿しているコード以外に必要なコードがありましたら用意しますので、おっしゃってください。)
新規予約のときに、room_idを紐付けたいですがどうしたらいいでしょうか?
step1 宿泊詳細:rooms/show *フォームで予約日数など入力
step2 予約確認:posts/confirm *ここで合計金額を表示
step3 予約一覧:posts/index *予約完了したので予約一覧へ飛ぶ
という流れを想定しています。
postsテーブルに、room.idを紐づけて、
・ step2確認画面(confirm.html)で合計金額(room.price * 日数)の表示
・ step3予約一覧(posts.index)で、[room.name],[room.image]などをテーブル表示させたい
と考えています。
postsに、room_idを紐付けたいですが、どうしたらいいでしょうか?
考えたこと、試したこと
テーブルは3つあり、postsには、[user_id],[room_id]のカラムを登録しました。
users(ユーザー情報) / rooms(宿泊施設の登録) / posts(予約)
「user_id」は、deviceを使用したため
postコントローラーのcreateで「@post.user_id = current_user.id 」として紐づけました。
「room_id」は、postコントローラーのcreateで
@room = Room.find(params[:id])
@post.room_id = @room.id
とすれば、予約フォーム以降で「予約したルームの内容」を取得できると考えていましたが、エラーになってしまいました。
@room = Room.find(params[:id])がnilだよ、と返ってきます。
ここから調べたり、binding.pryでいろいろ試してみたのですが、
どうしていいか分からなくなってしまいました。
ご教授いただけますと幸いです。
よろしくお願い致します。
発生している問題・エラー
class PostsController < ApplicationController
def index
@posts = Post.all
@rooms = Room.all
end
def new
@post = Post.new
@room = Room.find(params[:id])
end
def confirm
@post = Post.new(post_params)
end
def create
@post = Post.new(post_params)
# @room = Room.find(params[:id]) <=エラーが出る
@post.user_id = current_user.id
# @post.room_id = @room.id <=上でエラーが出るのでコメントにしてます。
if @post.save
redirect_to posts_path
else
render :confirm
end
end
# def show
# @post = Post.find(params[:id])
# end
def edit
end
def destroy
@post = Post.find(params[:id])
@post.destroy
redirect_to posts_path
end
private
def post_params
params.require(:post).permit(:startday, :endday, :peoples ,:fee)
end
end
宿泊詳細、予約フォーム↓
<%= form_for @post ,url: posts_confirm_path do |f| %>
Room.id:<%= @room.id %>
<h5>
<%= number_to_currency(@room.price, :unit => "円") %> / 日
</h5>
<hr size=".5px" color="#bbb">
<div class="form-group">
<%= @room.id %> <br>
<%= f.label :room_id%>
<%= f.text_field :room_id ,class:"profile_textfield form-control" %>
<%= f.label :user_id%>
<%= f.text_field :user_id ,class:"profile_textfield form-control" %>
<%= f.label :startday%>
<%= f.date_field :startday ,class:"profile_textfield form-control" %>
<%= f.label :endday%>
<%= f.date_field :endday ,class:"profile_textfield form-control" %>
<%= f.label :peoples%>
<%= f.text_field :peoples ,class:"profile_textfield form-control" %>
<button type="submit" class="btn btn-primary">予約確認へ進む</button>
</div>
<% end %>
予約確認画面↓
<div class="create">
<%= @room.id %>
<img src="<%= @room.image %>" width="50">
<%= @room.name %>
<%= @room.introduction %>
<%= @room.address %>
<h4>確認画面,,</h4><br>
<%= render "shared/error", obj: @post %>
<div class="create_form">
<%= @room.name %>
<%= form_for @post do |f| %>
Room.id:<%= @room.name %>
<h5>合計金額 <%= number_to_currency(@room.price) %>円 / 日</h5>
<hr size=".5px" color="#bbb">
<div class="form-group">
<%= @room.id %> <br>
<%= f.label :startday%>
<%= f.date_field :startday ,class:"profile_textfield form-control",readonly: true %>
<%= f.label :endday%>
<%= f.date_field :endday ,class:"profile_textfield form-control",readonly: true %>
<%= f.label :peoples%>
<%= f.text_field :peoples ,class:"profile_textfield form-control",readonly: true %>
<%= f.label :fee %>
<%= f.text_field :fee ,class:"profile_textfield form-control",readonly: true %>
</div>
<div class="actions">
<%= f.submit "予約する" %>
</div>
<div class="actions">
<%= f.submit "戻る", name: :back, class: "btn btn-secondary"%>
</div>
<% end %>
</div>
</div>
予約一覧↓
<h2>予約一覧</h2>
<table>
<thead>
<tr>
<th>予約者</th>
<th>ルーム画像</th>
<th>ルーム名</th>
<th>ルーム紹介</th>
<th>合計金額</th>
<th>チェックイン</th>
<th>チェックアウト</th>
<th>人数</th>
<th>予約確定日</th>
<th>確認</th>
<th>編集</th>
<th>キャンセル</th>
</tr>
</thead>
<tbody>
<% @posts.each do |post| %>
<tr>
<td><%= current_user.name %></td>
<td><%= post.id %></td>
<td><%= post.id %></td>
<td><%= post.id %></td>
<td><%= post.fee %></td>
<td><%= post.startday.strftime('%Y月%m日%d日') %></td>
<td><%= post.endday.strftime('%Y月%m日%d日') %></td>
<td><%= number_to_currency(post.peoples, :unit => "名様") %></td>
<td><%= post.updated_at.strftime('%Y月%m日%d日') %></td>
<td><%= link_to "確認", post, class:"textdeco"%></td>
<td><%= link_to "編集", [:edit, post], class:"textdeco" %></td>
<td><%= link_to "キャンセル", post, method: :delete, data:{confirm:"本当に削除しますか?"}, class:"textdeco" %></td>
</div>
</tr>
<% end %>
</tbody>
</table>
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
validates :name, presence: true
validates :introduction, length: { maximum: 200 }
mount_uploader :img, ImageUploader
has_many :rooms, dependent: :destroy
has_many :posts, dependent: :destroy
end
class Room < ApplicationRecord
belongs_to :user
belongs_to :post
mount_uploader :image, ImageUploader
end
class Post < ApplicationRecord
belongs_to :user
belongs_to :room
validates :startday, :endday, :peoples, :fee, presence: true
end
#postsのみ抜粋
create_table "posts", force: :cascade do |t|
t.date "startday"
t.date "endday"
t.integer "peoples"
t.integer "fee"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.integer "user_id"
t.integer "room_id"
end