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

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

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

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

Ruby

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

Q&A

解決済

1回答

382閲覧

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

komorigasa

総合スコア9

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/01/08 16:06

編集2018/01/08 16:28

###前提・実現したいこと
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| %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

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

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

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

エラーメッセージが

uninitialized constant Listing::Reservation

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

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


追加

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

投稿2018/01/08 16:12

編集2018/01/08 16:19
jun68ykt

総合スコア9058

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

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

komorigasa

2018/01/08 16:23

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

2018/01/08 16:29

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

2018/01/08 16:35 編集

> ファイル名はreservation.rbになっていたのですが、class名の綴りが間違えていました。 なるほどです。ということは、モデルクラスを rails generate で作っていない、という ことでしょうか? rails はご存じのとおり英単語の単数形、複数形でいろいろ紐づけるので、 綴り間違いは致命的だったりします。 > しかし、その後、またエラーが出てしまいました。 とのことなのですが、「またエラー」というのは、質問にあるエラーとは違うものでしょうか? それと、あと2点確認というか、開発時のデバッグの手法として (1) binding.pry を コントローラのメソッドの中の、肝になりそうなところに入れて止め、  周辺の変数の中を見る。 (2) rails console (略は rails c ) を使って、ビュー(erb)で使うであろうループだったりの  コードを、erb を作り上げてしまう前に試してみる。 といったことは、なさっておりますでしょうか?
jun68ykt

2018/01/08 16:34

追記のエラーを拝見しました。 > Could not find table 'reservations' とあるので、reservationsテーブルがDBに作成されていないです。 なので、 ・reservationsテーブル を作成するためのマイグレーションファイルは作っています? ・マイグレーションファイルを作った後に、 rails db:migrate でマイグレーションを実行していますか? というのが次の確認事項になります。
komorigasa

2018/01/08 16:36

今、確認したところ、データベースのテーブル名がresevations になっていました。 正しくはreservationsですので、モデルの名前をスペルミスして作成していたようです。 この場合、テーブル名の変更だけを行うことは可能でしょうか? それとも、モデルの作成からやり直した方がいいのでしょうか? 返信いただいた内容ですが、(1)の内容は知りませんでした。(2)は時々やっているのですが、毎回確認しながら行なっていきたいと思います。
komorigasa

2018/01/08 16:39

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

2018/01/08 16:46

> (1)の内容は知りませんでした。(2)は時々やっているのですが、毎回確認しながら行なっていきたいと思います。 については了解しました。 (1) については https://qiita.com/AknYk416/items/6f0bec58712edaf4940e AknYk416さん@qiita を読まれるとよいかと思います。 >テーブル名の変更だけを行うことは可能でしょうか? >それとも、モデルの作成からやり直した方がいいのでしょうか? についてですが、テーブルの作成をマイグレーションで行っているのであれば テーブル名変更のマイグレーションファイルを作って、マイグレーションを実行するのが Rails のお作法ですが、さきほど、モデルのクラス名を直で変えたと思うので、 それほど Reservation モデルを作り込んでいないのでしたら、 いったんサラにしてから、 やり直したほうがよいかもしれません。
jun68ykt

2018/01/08 16:50

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

2018/01/08 16:54

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

2018/01/08 16:59 編集

わかりました! それほど作り込んでいない状態なので、modelの削除を行い、再度作り直したいと思います。 >>順を追ってやらないと、きっとまたどこかでおかしくなるのでは ないかと思わなくもないです。 頭に刻み込んでおきます! 焦って一気に進めてしまう癖があるので、今回の一件で反省いたしました。 >>Reservation と Listing それぞれの単純な CRUD を、rails generate scaffold で作ってしまって、 いらないルーティングを除去したあとに、アソシエーションを追加していくというやり方でも よいかと思います。 そんな方法があるんですね! 試してみます! 深夜にも関わらず、迅速に、丁寧にご対応いただき、本当にありがとうございました。
jun68ykt

2018/01/08 16:57

> 焦って一気に進めてしまう癖 Rails はすごく便利なフレームワークなので、はやるお気持ちはわかります! 頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問