LoginSignup
ayaka-k
@ayaka-k (あやか)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

(Ruby,Rails初学者)予約確認フォームでRoom.find(params[:id])がエラー、room_idを紐付けたい

Q&AClosed

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でいろいろ試してみたのですが、
どうしていいか分からなくなってしまいました。

ご教授いただけますと幸いです。
よろしくお願い致します。

スクリーンショット 2021-01-29 16.29.21.png
スクリーンショット 2021-01-29 16.29.44.png

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

posts_controller
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


宿泊詳細、予約フォーム↓

posts/show.html.erb
        <%= 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 %>

予約確認画面↓

posts/confirm.html.erb
<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>

予約一覧↓

posts/index
<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>
user.rb
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

room.rb
class Room < ApplicationRecord
  belongs_to :user
  belongs_to :post

  mount_uploader :image, ImageUploader

end

post.rb
class Post < ApplicationRecord
  belongs_to :user
  belongs_to :room

  validates :startday, :endday, :peoples, :fee, presence: true 
end
schema.rb
#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
0

No Answers yet.

Your answer might help someone💌