現在、マッサージ店のウェブアプリをrailsで開発しているのですが
お客様のレビュー機能を作成したいと考えているのですが、
create部分がうまく機能せず(roolbackされてしまう)
投稿が作成できない事態になっております。
今回、usersテーブルとreservationsテーブルの中間テーブルとして
reviewsテーブルを作成しているのですが
中間テーブルを扱うのが初めてでうまくつかいこなせておりません。
お力を貸してもらえるとありがたいです!
他にも必要な情報があれば追加いたします!
現在のlogがこの様な状態です。
log関連↓
bash
1web_1 | Started POST "/reservations/1/reviews" for 172.24.0.1 at 2021-12-19 02:01:31 +0000 2web_1 | Cannot render console from 172.24.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 3web_1 | Processing by ReviewsController#create as JS 4web_1 | Parameters: {"authenticity_token"=>"[FILTERED]", "review"=>{"title"=>"テスト", "content"=>"テスト", "reservation_id"=>"#<Reservation:0x00007feef8744840>", "total_score"=>"3"}, "commit"=>"保存", "reservation_id"=>"1"} 5web_1 | User Load (1.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]] 6web_1 | TRANSACTION (1.5ms) BEGIN 7web_1 | ↳ app/controllers/reviews_controller.rb:16:in `create' 8web_1 | User Load (1.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 9web_1 | ↳ app/controllers/reviews_controller.rb:16:in `create' 10web_1 | Reservation Load (1.2ms) SELECT "reservations".* FROM "reservations" WHERE "reservations"."id" = $1 LIMIT $2 [["id", 0], ["LIMIT", 1]] 11web_1 | ↳ app/controllers/reviews_controller.rb:16:in `create' 12web_1 | TRANSACTION (1.4ms) ROLLBACK 13web_1 | ↳ app/controllers/reviews_controller.rb:16:in `create' 14web_1 | No template found for ReviewsController#create, rendering head :no_content 15web_1 | Completed 204 No Content in 30ms (ActiveRecord: 6.7ms | Allocations: 7367)
ルーティング↓
routes.rb
ruby
1Rails.application.routes.draw do 2#必要そうな箇所のみ記載 3 4 resources :stores 5 resources :reservations do 6 resources :reviews #今回の該当部分 7 collection do 8 get :management_new 9 get :search 10 get :confirm_reservation 11 get :reservation_management 12 post :reservation_management_create 13 end 14 member do 15 get :edit_reserve 16 post :update_reserve 17 end 18 end 19end 20 21 devise_for :users, controllers: { 22 sessions: 'users/sessions', 23 passwords: 'users/passwords', 24 registrations: 'users/registrations', 25 omniauth_callbacks: "omniauth_callbacks" 26 }
コントローラ関連↓
reviews_conroller.rb
ruby
1class ReviewsController < ApplicationController 2 skip_before_action :authenticate_staff! 3 4 def new 5 @reservation = Reservation.find_by(status: :completed) 6 # @reservation = Reservation.where(status: "competed") 7 @review = Review.new 8 # @reviews = @reservation.reviews.include(:user).order(created_at: :desc) 9 end 10 11 def create 12 review = Review.new(review_params) 13 review.user_id = current_user.id 14 if review.save 15 redirect_to root_path #とりあえずsaveがうまくいかない 16 end 17 end 18 19 private 20 def review_params 21 params.require(:review).permit(:reservation_id, :title, :content, :total_score) 22 end
モデル関連↓
review.rb
ruby
1class Review < ApplicationRecord 2 belongs_to :user 3 belongs_to :reservation 4end
reservation.rb
ruby
1class Reservation < ApplicationRecord 2 belongs_to :guest, class_name: 'User' 3 has_many :reviews, dependent: :destroy 4 # reservation: trueを記述する事でreservation_validator.rbのバリデーションを有効にする 5 validates :start_time, presence: true, reservation: true 6 validates :end_time, reservation: true 7 validates :course, presence: true 8 validates :guest_id, presence: true 9 validates :comment, length: { maximum: 200 } 10 validate :in_working_time 11 validate :end_time_is_invalid_without_a_start_time 12end
user.rb
ruby
1class User < ApplicationRecord 2 belongs_to :store, optional: true 3 has_many :reservations 4 has_many :reviews, dependent: :destroy 5 # A user has only one cart. User > Cart > Orders (join table) > Items 6 # dependent: :destroyは未設定なので、Userが削除されてもCartは残る 7 has_one :cart, dependent: :destroy 8 include JpPrefecture 9 jp_prefecture :prefecture_code 10 # Include default devise modules. Others available are: 11 # :confirmable, :lockable, :timeoutable, :trackable 12 devise :database_authenticatable, :registerable, 13 :recoverable, :rememberable, :validatable, 14 :omniauthable, omniauth_providers: %i[line] 15end
View関連
ruby
1<p>レビューを書く</p> 2 3<div class="rating-box mt-3"> 4 <%#= form_with(model: @review, url: reservation_reviews_path(@reservation), method: :post) local: true do |f| %> 5 <%= form_with(model:[@reservation,@review]) do |f| %> 6 <div class="form-group"> 7 <%= f.label :title %> 8 <%= f.text_field :title, class: "form-control" %> 9 </div> 10 11 <div class="form-group"> 12 <%= f.label :content %> 13 <%= f.text_area :content, class: "form-control" %> 14 </div> 15 <div class="main-rating"> 16 <div class="ratings mb-3"> 17 <span class="fa fa-star-o" id="star"></span> 18 <span class="fa fa-star-o" id="star"></span> 19 <span class="fa fa-star-o" id="star"></span> 20 <span class="fa fa-star-o" id="star"></span> 21 <span class="fa fa-star-o" id="star"></span> 22 </div> 23 <div class="ml-3 rating-value-display"><span id="rating-value-display">0</span>/5</div> 24 </div> 25 26 <div class="form-group"> 27 <%= f.submit "保存", class: "btn btn-primary mt-3" %> 28 </div> 29 30 <div class="form-group"> 31 <%= link_to "他のレビューを見る", reservation_reviews_path(@reservation), class: "btn btn-secondary" %> 32 </div> 33 34 <%= f.hidden_field :reservation_id, value: @reservation %> 35 <%= f.hidden_field :total_score, id: "rating-value" %> 36 <% end %> 37</div> 38 39<%= javascript_pack_tag 'review/reviews' %> 40
あなたの回答
tips
プレビュー