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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

0回答

511閲覧

レビュー機能実装中にMysqlでのエラー

nakajima777

総合スコア2

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2020/08/01 03:18

前提・実現したいこと

rubyでairbnbのようなシェアリングシステムを作っています。
レビュー機能を実装中に以下のエラーメッセージが発生しました。

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

レビューを書き込み、追加しようとすると以下のようなエラーが発生します。

イメージ説明

該当のソースコード

ruby2.5.1
rails5.2.4

<guest_reviews_controller.rb>

class GuestReviewsController < ApplicationController

def create
# Step 1: Check if the reservation exist (camera_id, host_id, host_id)

# Step 2: Check if the current host already reviewed the guest in this reservation. @reservation = Reservation.where( id: guest_review_params[:reservation_id], camera_id: guest_review_params[:camera_id] ).first if !@reservation.nil? && @reservation.camera.user.id == guest_review_params[:host_id].to_i @has_reviewed = GuestReview.where( reservation_id: @reservation.id, host_id: guest_review_params[:host_id] ).first if @has_reviewed.nil? # Allow to review @guest_review = current_user.guest_reviews.create(guest_review_params) flash[:success] = "Review created..." else # Already reviewed flash[:success] = "You already reviewed this Reservation" end else flash[:alert] = "Not found this reservation" end redirect_back(fallback_location: request.referer)

end

def destroy
@guest_review = Review.find(params[:id])
@guest_review.destroy

redirect_back(fallback_location: request.referer, notice: "Removed...!")

end

private
def guest_review_params
params.require(:guest_review).permit(:comment, :star, :camera_id, :reservation_id, :host_id)
end
end

<schma.rb>

create_table "reviews", force: :cascade do |t|
t.text "comment"
t.integer "star", default: 1
t.integer "camera_id"
t.integer "reservation_id"
t.integer "guest_id"
t.integer "host_id"
t.string "type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["camera_id"], name: "index_reviews_on_camera_id"
t.index ["guest_id"], name: "index_reviews_on_guest_id"
t.index ["host_id"], name: "index_reviews_on_host_id"
t.index ["reservation_id"], name: "index_reviews_on_reservation_id"
end

<gem>

ruby '2.5.1'

gem 'rails', '> 5.2.4', '>= 5.2.4.3'
gem 'sqlite3'
gem 'puma', '
> 3.11'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'

gem 'coffee-rails', '> 4.2'
gem 'turbolinks', '
> 5'
gem 'jbuilder', '~> 2.5'
gem 'bootsnap', '>= 1.1.0', require: false

group :development, :test do
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end

group :test do
gem 'capybara', '>= 2.15'
gem 'chromedriver-helper'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

gem 'bootstrap-sass', '~> 3.4.1'
gem 'devise'

gem 'toastr-rails'
gem 'jquery-rails', '4.3.1'

gem 'paperclip', '> 5.1.0'
gem 'aws-sdk', '
> 2.8'

gem 'geocoder', '> 1.4'
gem 'jquery-ui-rails', '
> 5.0'

gem "ransack", '~> 2.1.1'

gem 'carrierwave'

試したこと

migrationの打ち間違いがないか確認。
該当エラーをググってみたが見つかりませんでした。

足りないリソースあれば、提供させて頂きます。

よろしくお願いします。

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

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

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

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

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

daihi

2020/08/01 05:14

`rails db:migration`は実行していますか? また、permitに:guest_idを指定していませんが意図はありますか??
nakajima777

2020/08/01 05:23

rails db:migrate は実行しています。 guestからのレビューにguest_idは不要と認識していました。 :guest_idを追加し、実行したところエラー解消には繋がりませんでした。
daihi

2020/08/01 05:32

gest_reviewモデルの記述を見せてもらえますか??
nakajima777

2020/08/01 05:38

class GuestReview < Review belongs_to :guest, class_name: "User" end gest_reviewモデルは上記のみ記載してあります。
daihi

2020/08/01 05:50

なるほどー アソシエーションでcurrent_userからguest_reviewsとして、createメソッドを実行していますが、 guest_reviewsは複数になるためそのままではcreateは実行できなさそうです。 以下2点の修正を試してみてください! ①`@guest_review = GuestReview.create(guest_review_params)` に変更 ②以下の記述で、ストロングパラメータにmergeメソッドでguest_idを追加する params.require(:guest_review).permit(:comment, :star, :camera_id, :reservation_id, :host_id).merge(guest_id: current_user.id)
nakajima777

2020/08/01 05:57

具体的な案をありがとうございます。 試してみたところエラー内容は変わらずです。 やはりコントローラーが問題なのでしょうか?
daihi

2020/08/01 06:01

あっ今気づきましたが、GuestReviewはReviewを継承しているのですね! Reviewモデルの記述がみたいです!
nakajima777

2020/08/01 07:10 編集

class Review < ApplicationRecord end reviewモデルは何も記述していない状況です。 class ApplicationRecord < ActiveRecord::Base self.abstract_class = true end となっております。
daihi

2020/08/01 07:20

Reviewクラスに`self.abstract_class = true`を追記してみてください! 今回のエラー文は解消されると思います。 (おそらくそのあと別のエラーでロールバックが必要になります。)
nakajima777

2020/08/01 07:31

エラー文解消されました! ありがとうございます。 ご指摘の通り別のエラーが発生しました。 Could not find table 'guest_reviews'(エラー内容) <以下該当箇所> if !@reservation.nil? && @reservation.camera.user.id == guest_review_params[:host_id].to_i @has_reviewed = GuestReview.where( reservation_id: @reservation.id, host_id: guest_review_params[:host_id] ).first こちらのエラー内容で問題ないでしょうか?
daihi

2020/08/01 07:39 編集

お!よかったです! すでに記載いただいていたマグレーションの記述を見るに、作成されているテーブルはreviewsだと思います。 これを、guest_reviewsに変更すれば、エラーが解消されるかと思います。 もしまだreviewsテーブルに重要なデータが入っていないのであれば、 以下を行ってみてください! ○rails db:rollbackを実行してロールバック → マイグレーションの'reviews'を'guest_reviews'に変更  →rails db:migrateでマイグレーションを実行
nakajima777

2020/08/01 08:03

一旦別でguest_reviewsを新しく作成して 実装してみたところ、最初に出たエラーがまた起きてしまいました。 いきなり変更するのが怖かったので、一旦別で作ったのですが 'reviews'を'guest_reviews'に変更すれば解消されるでしょうか?
daihi

2020/08/01 08:16

おお、まったく同じエラー文でしょうか? guest_reviews作成のためのマイグレーションを見てみたいです! > 'reviews'を'guest_reviews'に変更すれば解消されるでしょうか? ちょっと微妙なところです。。 変更でなくとも、guest_reviewsテーブルが存在していれば解消されると思っていたので。 ただし、やってみる価値はありそうです。
nakajima777

2020/08/01 08:30 編集

class CreateGuestReviews < ActiveRecord::Migration[5.2] def change create_table :guest_reviews do |t| t.text :comment t.integer :star, default: 1 t.references :camera, foreign_key: true t.references :reservation, foreign_key: true t.references :guest, foreign_key: true t.references :host, foreign_key: true t.string :type t.timestamps end end end 全く同じエラーです。 SQLite3::SQLException: no such table: main.hosts: INSERT INTO "guest_reviews" ("comment", "camera_id", "reservation_id", "guest_id", "host_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) 下記部分がエラーになってしまいます。 @guest_review = GuestReview.create(guest_review_params)
daihi

2020/08/01 08:57

うーんん、やはりDB関連が怪しいですね。 マイグレーション実行時のログはどのようになっていますか?なにか表示されていますか??
nakajima777

2020/08/01 09:07

== 20200801074125 CreateGuestReviews: migrating =============================== -- create_table(:guest_reviews) -> 0.0204s == 20200801074125 CreateGuestReviews: migrated (0.0206s) ====================== ログでは特に問題はありませんでした。 def guest_review_params # params.require(:guest_review).permit(:comment, :star, :camera_id, :reservation_id, :host_id).merge(guest_id: current_user.id) params.require(:guest_review).permit(:comment, :star, :camera_id, :reservation_id, :host_id) end 上記のように、当初のコードにした場合、レビュー投稿に成功しました。 しかし、DBの中を見てみると空のままでした。 だから、viewでレビュー欄には何も投稿されていない状態になります。 やはりDB関連でしょうか、、?
daihi

2020/08/02 14:13

おそくなりました! DB関連か原因なのかは、まだ確証がありませんので、なんともです。。 Userモデルの記述を見せてもらえますか?? アソシエーションがどうなっているのか気になります。
nakajima777

2020/08/02 15:41

コメントありがとうございます。 class User < ApplicationRecord mount_uploader :image, ImageUploader # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :fullname, presence: true, length: {maximum: 50} has_many :cameras has_many :reservations has_many :guest_reviews, class_name: "GuestReview", foreign_key: "guest_id" has_many :host_reviews, class_name: "HostReview", foreign_key: "host_id" end 上記がUserモデルになります。
daihi

2020/08/02 17:14

あれ、foreign_keyがなんか怪しいです。 guest_reviewsテーブルには、user_idは存在せず、guest_idがあるのでしょうか? もしそうであれば、 GuestReviewモデルのアソシエーションで、Userモデルに従属させてますが、そこへ foreign_key: "guest_id" の記述が必要かもしれません。
daihi

2020/08/02 17:20

ああ、has_manyにすでに指定があるからいいかもしれない?ですね。。
nakajima777

2020/08/03 11:16

class GuestReview < Review belongs_to :guest, class_name: "User", foreign_key: "guest_id" end 上記で試してみたのですが、やはりエラー解消しませんでした、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問