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

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

ただいまの
回答率

90.98%

  • Ruby

    6398questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails 5

    823questions

showページでエラーが起きてしまう。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 87

komorigasa

score 3

前提・実現したいこと

Ruby on RailsでCtoCのサイトを作っています。
現在、予約のモデルを作成し、さらに予約フォームを作成しようとしています。
予約のフォームを作るために、tarminalにてreservationのモデルを作成しました。
その後、modelのreservations.rb、reservations_controller.rbを作成しました。
次にviewを作ろうとしている状態です。
form_forタグを使い、pathを書いたところ、以下のエラーメッセージが発生しました。
おそらく、reservations#createのpathの受け渡しがうまくいっていないのだと思いますが、rubyのテキストなどをみても、エラーの原因がわかりません。
どなたか、教えていただけないでしょうか。

teratailでの初めての質問で、何を書いて良いのかわからないのですが、現在の状況は、以下の通りです。

よろしくお願いいたします。

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

NameError in Listings#show
Showing /Users/komorigasa/Desktop/Travelshare/app/views/listings/show.html.erb where line #86 raised:

uninitialized constant Listing::Reservation
Extracted source (around line #86):



85                      <div class="panel-body panel-real">         
86                           <%= form_for [@listing, @listing.reservations.build] do |f| %>



Rails.root: /Users/komorigasa/Desktop/Travelshare

Application Trace | Framework Trace | Full Trace
app/views/listings/show.html.erb:86:in `_app_views_listings_show_html_erb__1810852686616138623_70176348929420'


以下は、私のソースコードです。
ルート、コントローラー、ビューの順で作っています。

route.rb

Rails.application.routes.draw do
  resources :listings

  root :to => "pages#index"

  devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks', registrations: 'registrations' }


  resources :users, only: [:show]

  resources :photos, only: [:create, :destroy] do
    collection do
      get :list
    end
  end

  resources :listings do 
    resources :reservations, only: [:create,]
  end

  get 'manage-listing/:id/basics' => 'listings#basics', as: 'manage_listing_basics'
  get 'manage-listing/:id/description' => 'listings#description', as: 'manage_listing_description'
  get 'manage-listing/:id/address' => 'listings#address', as: 'manage_listing_address'
  get 'manage-listing/:id/price' => 'listings#price', as: 'manage_listing_price'
  get 'manage-listing/:id/photos' => 'listings#photos', as: 'manage_listing_photos'
  get 'manage-listing/:id/calendar' => 'listings#calendar', as: 'manage_listing_calendar'
  get 'manage-listing/:id/bankaccount' => 'listings#bankaccount', as: 'manage_listing_bankaccount'
  get 'manage-listing/:id/publish' => 'listings#publish', as: 'manage_listing_publish'

end

reservations_controller.rb

class ReservationsController < ApplicationController
    before_action :authenticate_user!

    def create
        @reservation = current_user.reservations.create(reservation_params)  

        redirect_to @reservation.listing, notice: "予約が完了しました。" 
    end


    private
        def reservation_params
            params.require(:reservation).permit(:number, :by_time, :price, :total_price, :listing_id)
        end
end

show.html.erb

                <!-- 予約フォーム -->
                <div class="col-md-3">
                    <div class="panel panel-default panel-show">
                        <div class="panel-heading">
                                <span style="font-size:16px;"><%= @listing.price %>円(一荷物あたり)</span>
                        </div>

                        <div class="panel-body panel-real">         
                            <%= form_for [@listing, @listing.reservations.new] do |f| %>


                                <!-- 予約時に一緒におくるデータ-->
                                <%= f.hidden_field :listing_id, value: @listing.id %>
                                <%= f.hidden_field :price, value: @listing.price %>
                                <%= f.hidden_field :total_price, id:'reservation_total_price' %>

                                <div class="row row-space-2">
                                    <div class="col-md-6">
                                        <label>Check In</label>
                                          <%= f.text_field :price, :class => 'form-control', placeholder: '価格' %>
                                    </div>

                                    <div class="col-md-6">
                                        <label>Check Out</label>
                                        <%= f.text_field :by_date, :class => 'form-control', placeholder: '期限' %>
                                    </div>
                                </div>            

                                <div class="actions text-center">
                                    <%= f.submit "この日程で予約する", class: "btn btn-danger btn-wide" %>
                                </div>
                            <% end %>
                        </div>
                    </div>
                </div>

reservation.rb

class Resevation < ApplicationRecord
  belongs_to :user
  belongs_to :listing
end

 listing.rb

class Listing < ActiveRecord::Base
  belongs_to :user
  has_many :photos
  has_many :reservations

  validates :travel_type, presence:true
  validates :travel_country, presence:true
  validates :travel_departure, presence:true
  validates :travel_arrival, presence:true


  geocoded_by :address
  after_validation :geocode, :if => :address_changed?

end

user.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable

has_many :listings
has_many :reservations

end

 追記エラー

ActiveRecord::StatementInvalid in Listings#show
Showing /Users/komorigasa/Desktop/Travelshare/app/views/listings/show.html.erb 

Could not find table 'reservations'
Extracted source (around line #86):


85                      <div class="panel-body panel-real">         
86                           <%= form_for [@listing, @listing.reservations.build] do |f| %>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

こんにちは

ご質問の中で、ここが怪しいのでは?と思った点がありまして、

その後、modelのreservations.rb、reservations_controller.rbを作成しました。

とあるのですが、reservations.rb ではなくて、単数形の reservation.rb で
クラス名も単数形の Reservation クラスが実装されていなくてはなりませんが、
いかがでしょうか?

エラーメッセージが

uninitialized constant Listing::Reservation

であることからも上記が怪しい気がしました。

以上参考になれば幸いです。


追加

ソースコードのほうは reservation.rb と正しく単数形になっていたので、
冒頭の reservations.rb のほうは単なるタイポなのでしょうか?
もしそうだとすれば、私のこの回答は無意味なのでスルーしてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/09 01:23

    ありがとうございます!
    ファイル名はreservation.rbになっていたのですが、class名の綴りが間違えていました。
    Resevation → Reservation に修正しました。
    しかし、その後、またエラーが出てしまいました。

    キャンセル

  • 2018/01/09 01:29

    追記エラーのような内容が出てしまったのですが、これは、データベースの問題ということでしょうか?

    キャンセル

  • 2018/01/09 01:35 編集

    > ファイル名はreservation.rbになっていたのですが、class名の綴りが間違えていました。

    なるほどです。ということは、モデルクラスを rails generate で作っていない、という
    ことでしょうか? rails はご存じのとおり英単語の単数形、複数形でいろいろ紐づけるので、
    綴り間違いは致命的だったりします。

    > しかし、その後、またエラーが出てしまいました。

    とのことなのですが、「またエラー」というのは、質問にあるエラーとは違うものでしょうか?

    それと、あと2点確認というか、開発時のデバッグの手法として

    (1) binding.pry を コントローラのメソッドの中の、肝になりそうなところに入れて止め、
     周辺の変数の中を見る。

    (2) rails console (略は rails c ) を使って、ビュー(erb)で使うであろうループだったりの
     コードを、erb を作り上げてしまう前に試してみる。

    といったことは、なさっておりますでしょうか?

    キャンセル

  • 2018/01/09 01:34

    追記のエラーを拝見しました。

    > Could not find table 'reservations'

    とあるので、reservationsテーブルがDBに作成されていないです。
    なので、

    ・reservationsテーブル を作成するためのマイグレーションファイルは作っています?

    ・マイグレーションファイルを作った後に、 rails db:migrate でマイグレーションを実行していますか?

    というのが次の確認事項になります。

    キャンセル

  • 2018/01/09 01:36

    今、確認したところ、データベースのテーブル名がresevations になっていました。
    正しくはreservationsですので、モデルの名前をスペルミスして作成していたようです。
    この場合、テーブル名の変更だけを行うことは可能でしょうか?
    それとも、モデルの作成からやり直した方がいいのでしょうか?

    返信いただいた内容ですが、(1)の内容は知りませんでした。(2)は時々やっているのですが、毎回確認しながら行なっていきたいと思います。

    キャンセル

  • 2018/01/09 01:39

    もしよろしければ、(1)(2)のやり方を詳しく解説した参考ページなどを貼っていただけないでしょうか?
    深夜におつきあいさせてしまい、申し訳ありません。

    キャンセル

  • 2018/01/09 01:46

    > (1)の内容は知りませんでした。(2)は時々やっているのですが、毎回確認しながら行なっていきたいと思います。

    については了解しました。 (1) については
    https://qiita.com/AknYk416/items/6f0bec58712edaf4940e AknYk416さん@qiita
    を読まれるとよいかと思います。

    >テーブル名の変更だけを行うことは可能でしょうか?
    >それとも、モデルの作成からやり直した方がいいのでしょうか?

    についてですが、テーブルの作成をマイグレーションで行っているのであれば
    テーブル名変更のマイグレーションファイルを作って、マイグレーションを実行するのが
    Rails のお作法ですが、さきほど、モデルのクラス名を直で変えたと思うので、
    それほど Reservation モデルを作り込んでいないのでしたら、 いったんサラにしてから、
    やり直したほうがよいかもしれません。

    キャンセル

  • 2018/01/09 01:50

    現時点である程度作り込んであるものは、どこかに保存しておいて、
    rails new からやり直してもよいかもしれません。
    まずは、Reservation の CRUD が(テーブル含めて)しっかりできていることを確認してから、
    Listing モデルを追加してと、順を追ってやらないと、きっとまたどこかでおかしくなるのでは
    ないかと思わなくもないです。

    キャンセル

  • 2018/01/09 01:54

    Reservation と Listing それぞれの単純な CRUD を、rails generate scaffold で作ってしまって、
    いらないルーティングを除去したあとに、アソシエーションを追加していくというやり方でも
    よいかと思います。

    以上参考になりましたら幸いです。

    キャンセル

  • 2018/01/09 01:59 編集

    わかりました!
    それほど作り込んでいない状態なので、modelの削除を行い、再度作り直したいと思います。

    >>順を追ってやらないと、きっとまたどこかでおかしくなるのでは
    ないかと思わなくもないです。

    頭に刻み込んでおきます!
    焦って一気に進めてしまう癖があるので、今回の一件で反省いたしました。

    >>Reservation と Listing それぞれの単純な CRUD を、rails generate scaffold で作ってしまって、
    いらないルーティングを除去したあとに、アソシエーションを追加していくというやり方でも
    よいかと思います。

    そんな方法があるんですね!
    試してみます!

    深夜にも関わらず、迅速に、丁寧にご対応いただき、本当にありがとうございました。

    キャンセル

  • 2018/01/09 01:57

    > 焦って一気に進めてしまう癖

    Rails はすごく便利なフレームワークなので、はやるお気持ちはわかります!
    頑張ってください。

    キャンセル

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

  • ただいまの回答率 90.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    6398questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails 5

    823questions