2016-11-17 6 views
0

Ich glaube, ich habe ein Routing-Problem: Ich habe eine Funktion, mit der Benutzer eine Überprüfung einer bestimmten Person hinterlassen können. Also habe ich ein Bewertungsmodell und ein Individuumsmodell. Ich versuche, eine Möglichkeit zu finden, bestimmte Rezensionen zu dieser Person zu löschen.Löschen einer Review-Route Routen

routes.rb:

resources :individuals do 
     collection do 
     get 'search' 
     end 
     collection do 
     get 'schools' 
     end 
     member do 
     post 'flag', :individuals 
     end 
     resources :reviews do 
     member do 
      post 'flag', 'vote', 'downvote', :review 
     end 
     resources :reviews, only: [:index, :create] 


     end 

    end 

    resources :reviews, only: [:destroy, :update, :edit] 

Deshalb glaube ich, wenn ich das richtig gemacht habe ich für die Bewertungen Index verschachtelt werden und erstellen: individuals/1/reviews/2 aber nicht für Aktionen zu zerstören, zu aktualisieren und zu bearbeiten: reviews/1/edit.

Bewertungen Controller:

def destroy 
    @review.destroy 
    respond_to do |format| 
     format.html { redirect_to @professor, notice: 'Review was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

View.html.rb:

<% if @review.blank? %> 
    Nothing to review! 
    <% else %> 
    <div class="list-group"> 
    <ul class="list-unstyled"> 
    <% @review.each do |review| %> 
     <li class="list-group-item"> <%= review.comment %> Review Flagged: 
      <%= pluralize(review.flag, 'time') %>. <%= link_to 'View', professor_review_path(review.professor, review) %> 
      <%= link_to 'Edit', edit_individual_review_path(review.individual, review) %> 
      <%= link_to 'Delete', destroy_review_path(review), data: {confirm: "Are you sure you want to delete this review?"} %> </li> 
     <% end %> 

    </ul> 
    </div> 
    <% end %> 

Die Ansicht Seite ich ein

bekommen
NoMethodError: undefined method `destroy_review_path' for #<#<Class:0x007fb095e46e28>:0x007fb09d1afdb0> 
Did you mean? edit_review_path 

ich dies für nicht funktioniert, bekommen haben zu arbeiten Löschen von Personen.

Antwort

1

Kein Routing-Problem hier :)

Dies ist nur ein schwer zu versteh auf dem ersten Subtilität von RESTful-Routing.

Wenn Sie rake routes ausführen, sehen Sie die Definitionen für alle Ihre Routen.

GET /reviews   reviews#index reviews_path 
POST /reviews   reviews#create 
GET /reviews/new  reviews#new  new_review_path 
GET /reviews/:id/edit reviews#edit  edit_review_path 
GET /reviews/:id  reviews#show  review_path 
PUT /reviews/:id  reviews#update 
DELETE /reviews/:id  reviews#destroy 

Sie werden feststellen, dass es keine as: Namensgebung für einige der Routen.

Dies liegt daran, dass die Routennamen dem URL-Pfad und nicht dem Controller oder der Aktion entsprechen.

Beachten Sie, dass die Routen, die den gleichen URL-Pfad verwenden, auch denselben Routennamen verwenden.

und eine einzige RESTful Route 4 verschiedene Verb Typen verwenden kann (d.h. GET, POST, PUT/PATCH, DELETE) für eine einzelne Route.

Der richtige Link-Code lautet wie folgt:

<%= link_to 'Delete', review_path(review), method: :delete, data: {confirm: "Are you sure you want to delete this review?"} %> </li> 
+0

Hey danke Ihnen so sehr. Du hast mir dabei wirklich geholfen, ein anderes Problem, das ich gelöst habe, ist, dass ich eine Vorher-Aktion hatte, die das Individuum veränderte, aber ich änderte es: 'before_action: set_professor,: except => [: flag,: vote,: destroy] 'und es funktioniert jetzt. – tfantina

+0

Hey kein Problem, häkeln Sie dies als Antwort? Auch mit 'before_action, expect: [: action]' finde ich irgendwie gefährlich ... Nicht sicher, was dein Kontext ist, aber ich 100% mache immer 'before_action, only: [: action]' stattdessen. – fbelanger