dimanche 30 juillet 2017

Couldn't find Resturant with 'id'=5

I am building this app and nested the reviews inside the restaurants. i have set all the permisions so only the users who are the owner of the review can delete their reviews. when i delete the review , the restaurant also gets deleted and i get this error Couldn't find Restaurant with 'id'=5. How can i solve that issue ? here's my code:

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: 'http://ift.tt/2v9lIZZ',
    readOnly: true ,
     score: function() {
    return $(this).attr('data-score');
  }
  });
</script>

the Routes file

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://ift.tt/GVpneB
end

rake routes file

                  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

models/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

Aucun commentaire:

Enregistrer un commentaire