2017-07-30 77 views
1

我正在構建這個應用程序,並在餐廳內嵌套評論。我已經設置了所有權限,因此只有作爲評論所有者的用戶才能刪除他們的評論。當我刪除審查,餐廳也被刪除,我得到這個錯誤Couldn't find Restaurant with 'id'=5。我該如何解決這個問題?這裏是我的代碼:找不到與'id'= 5的餐廳

resturants_controller

class ResturantsController < ApplicationController 
    before_action :set_resturant, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user! , except: [:index,:show] 
    before_action :check_user , only: [:edit,:update,:destroy] 

    # GET /resturants 
    # GET /resturants.json 
    def index 
    @resturants = Resturant.all 
    end 

    # GET /resturants/1 
    # GET /resturants/1.json 
    def show 
    @reviews = Review.where(resturant_id: @resturant.id) 
     if @reviews.blank? 
     @average_rating = 0 
    else 
     @average_rating = @reviews.average(:rating).round(2) 
    end 
    end 

    # GET /resturants/new 
    def new 
    @resturant = Resturant.new 
    end 

    # GET /resturants/1/edit 
    def edit 
    end 

    # POST /resturants 
    # POST /resturants.json 
    def create 
    @resturant = Resturant.new(resturant_params) 
    @resturant.user_id = current_user.id 

    respond_to do |format| 
     if @resturant.save 
     format.html { redirect_to @resturant, notice: 'Resturant was successfully created.' } 
     format.json { render :show, status: :created, location: @resturant } 
     else 
     format.html { render :new } 
     format.json { render json: @resturant.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /resturants/1 
    # PATCH/PUT /resturants/1.json 
    def update 
    respond_to do |format| 
     if @resturant.update(resturant_params) 
     format.html { redirect_to @resturant, notice: 'Resturant was successfully updated.' } 
     format.json { render :show, status: :ok, location: @resturant } 
     else 
     format.html { render :edit } 
     format.json { render json: @resturant.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /resturants/1 
    # DELETE /resturants/1.json 
    def destroy 
    @resturant.destroy 
    respond_to do |format| 
     format.html { redirect_to resturants_url, notice: 'Resturant was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_resturant 
     @resturant = Resturant.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def resturant_params 
     params.require(:resturant).permit(:name, :descirption, :website, :phone,:image) 
    end 

    def check_user 
     unless @resturant.user = current_user 
     redirect_to root_path , alert: "Sorry this Resturant belongs to someone else" 
     end 
    end 
end 

reviews_controller

class ReviewsController < ApplicationController 
    before_action :set_review, only: [:edit, :update, :destroy] 
    before_action :set_resturant 
    before_action :authenticate_user! 
    before_action :check_user, only: [:edit, :update, :destroy] 



    # GET /reviews/new 
    def new 
    @review = Review.new 
    end 

    # GET /reviews/1/edit 
    def edit 
    end 

    # POST /reviews 
    # POST /reviews.json 
    def create 
    @review = Review.new(review_params) 
    @review.user_id = current_user.id 
    @review.resturant_id = @resturant.id 

    respond_to do |format| 
     if @review.save 
     format.html { redirect_to resturant_path(@resturant), notice: 'Review was successfully created.' } 
     format.json { render :show, status: :created, location: @review } 
     else 
     format.html { render :new } 
     format.json { render json: @review.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /reviews/1 
    # PATCH/PUT /reviews/1.json 
    def update 
    respond_to do |format| 
     if @review.update(review_params) 
     format.html { redirect_to @review, notice: 'Review was successfully updated.' } 
     format.json { render :show, status: :ok, location: @review } 
     else 
     format.html { render :edit } 
     format.json { render json: @review.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /reviews/1 
    # DELETE /reviews/1.json 
    def destroy 
    @review.destroy 
    respond_to do |format| 
     format.html { redirect_to resturant_path(@resturant), notice: 'Review was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_review 
     @review = Review.find(params[:id]) 
    end 

    def set_resturant 
     @resturant = Resturant.find(params[:resturant_id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def review_params 
     params.require(:review).permit(:rating, :comment) 
    end 

    def check_user 
     unless @review.user = current_user 
     redirect_to root_path , alert: "Sorry this review belongs to someone else" 
     end 
    end 


end 

resturants/show.html.erb

<div class="row"> 
    <div class="col-md-5"> 
     <p id="notice"><%= notice %></p> 

    <%= image_tag @resturant.image_url %> 

    <div class="star-rating" data-score= <%= @average_rating %> ></div> 
    <p><%= "#{@reviews.length} reviews"%></p> 
    <p> 
    <strong>Name:</strong> 
    <%= @resturant.name %> 
    </p> 


    <p> 
    <strong>Descirption:</strong> 
    <%= @resturant.descirption %> 
    </p> 

    <p> 
    <strong>Website:</strong> 
    <%= link_to @resturant.website, @resturant.website %> 
    </p> 

    <p> 
    <strong>Phone:</strong> 
    <%= @resturant.phone %> 
    </p> 



    <%= link_to "Write a review", new_resturant_review_path(@resturant), class: "btn btn-danger"%> 
    <%= link_to 'Edit', edit_resturant_path(@resturant) %> | 
    <%= link_to 'Back', resturants_path %> 

    </div> 

    <div class="col-md-7"> 
    <% if @reviews.blank? %> 
     <h3>No Reviews yet</h3> 
    <%else%> 
     <table class="table"> 
     <tbody> 
      <% @reviews.each do |review|%> 
      <tr> 
      <td> 
       <div class="star-rating" data-score= <%= review.rating%> ></div> 
       <p><%= review.comment%></p> 
       <%if user_signed_in?%> 
       <%if (review.user == current_user)%> 
       <%= link_to "Edit", edit_resturant_review_path(@resturant,review)%> 
       <%= link_to "Delete", resturant_review_path(@resturant,review), method: :delete %> 
       <%end%> 
       <%end%> 
      </td> 
      </tr> 
      <%end%> 
     </tbody> 
     </table> 
    <%end%> 
</div> 


<script type="text/javascript"> 
    $('.star-rating').raty({ 
    path: 'https://s3.ap-south-1.amazonaws.com/starsratings', 
    readOnly: true , 
    score: function() { 
    return $(this).attr('data-score'); 
    } 
    }); 
</script> 

的routes文件

Rails.application.routes.draw do 

    get 'pages/welcome' 

    get 'pages/about' 

    devise_for :users 
    root 'resturants#index' 
resources :resturants do 
    resources :reviews , except: [:index,:show] 
end 

    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
end 

耙routes文件

    Prefix Verb URI Pattern           Controller#Action 
      pages_welcome GET /pages/welcome(.:format)        pages#welcome 
      pages_about GET /pages/about(.:format)        pages#about 
     new_user_session GET /users/sign_in(.:format)        devise/sessions#new 
      user_session POST /users/sign_in(.:format)        devise/sessions#create 
    destroy_user_session DELETE /users/sign_out(.:format)       devise/sessions#destroy 
     new_user_password GET /users/password/new(.:format)      devise/passwords#new 
     edit_user_password GET /users/password/edit(.:format)      devise/passwords#edit 
      user_password PATCH /users/password(.:format)       devise/passwords#update 
         PUT /users/password(.:format)       devise/passwords#update 
         POST /users/password(.:format)       devise/passwords#create 
cancel_user_registration GET /users/cancel(.:format)        devise/registrations#cancel 
    new_user_registration GET /users/sign_up(.:format)        devise/registrations#new 
    edit_user_registration GET /users/edit(.:format)        devise/registrations#edit 
     user_registration PATCH /users(.:format)          devise/registrations#update 
         PUT /users(.:format)          devise/registrations#update 
         DELETE /users(.:format)          devise/registrations#destroy 
         POST /users(.:format)          devise/registrations#create 
        root GET /             resturants#index 
     resturant_reviews POST /resturants/:resturant_id/reviews(.:format)   reviews#create 
    new_resturant_review GET /resturants/:resturant_id/reviews/new(.:format)  reviews#new 
    edit_resturant_review GET /resturants/:resturant_id/reviews/:id/edit(.:format) reviews#edit 
     resturant_review PATCH /resturants/:resturant_id/reviews/:id(.:format)  reviews#update 
         PUT /resturants/:resturant_id/reviews/:id(.:format)  reviews#update 
         DELETE /resturants/:resturant_id/reviews/:id(.:format)  reviews#destroy 
       resturants GET /resturants(.:format)        resturants#index 
         POST /resturants(.:format)        resturants#create 
      new_resturant GET /resturants/new(.:format)       resturants#new 
      edit_resturant GET /resturants/:id/edit(.:format)      resturants#edit 
       resturant GET /resturants/:id(.:format)       resturants#show 
         PATCH /resturants/:id(.:format)       resturants#update 
         PUT /resturants/:id(.:format)       resturants#update 
         DELETE /resturants/:id(.:format)       resturants#destroy 

型號/ review.rb

class Review < ApplicationRecord 
     belongs_to :user , dependent: :destroy 
     belongs_to :resturant , dependent: :destroy 
    end 

**models/resturant.rb** 

class Resturant < ApplicationRecord 
    mount_uploader :image, ImageUploader 
    belongs_to :user, dependent: :destroy 
    validates :name , :descirption , :website , :phone , presence: true 
    has_many :reviews 

    validates :phone , numericality: { 
     only_integer: true, 
    } 
end 

my github repo

+0

可能因爲你試圖刪除一個餐廳的*評論*,但控制器處理它像它刪除RESTURANT,這是不能保證存在。或者它可能是相反的。現在查看錯誤。 – MrKickkiller

+0

也註冊工程,但是當我嘗試使用新帳戶登錄時,我收到無效的電子郵件和密碼錯誤。 – AHmed

+0

你有沒有可能發佈服務器的日誌呢?一般來看,這一切都看起來沒問題,但它顯然不是。 – MrKickkiller

回答

4

當你刪除評論則餐廳被刪除過這一行的,因爲:

belongs_to :resturant , dependent: :destroy 

將其更改爲:

belongs_to :resturant 

而且你也有類似的線Resturant這意味着:當一個resturant被刪除,然後刪除餐廳的user。你可能不想這樣做。

belongs_to :user, dependent: :destroy 

dependent選項並沒有告訴應該發生在self什麼關聯時被刪除,但是當self被刪除應該發生關聯的對象是什麼。

恕我直言,下面的配置會更有意義:

class Resturant < ApplicationRecord 
    belongs_to :user 
    has_many :reviews, dependent: :destroy 

class Review < ApplicationRecord 
    belongs_to :resturant 
    belongs_to :user 

class User < ApplicationRecord 
    has_many :resturants, dependent: :destroy 
    has_many :reviews, dependent: :destroy 
+0

你打了我一分鐘。我剛剛發現了依賴關係,並打算輸入:) – MrKickkiller

+0

也許指出了正確的做法,如果目標是在餐館被摧毀時銷燬所有餐廳的評論,這似乎可能是OP的意圖 –

+0

@ m.simonborg這是個好主意。謝謝。我更新了我的答案。 – spickermann