2016-11-17 121 views
0

我相信我有一个路由问题:我有一个功能,允许用户留下审查一个特定的个人。所以我有一个评论模型和一个个人模型。我试图找到一种方法来删除该用户的具体评论。删除评论Rails路由

的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] 

所以,我相信,如果我这样做的权利,我会嵌套的审查指标和创建:individuals/1/reviews/2但不采取行动摧毁,更新和编辑:reviews/1/edit

点评控制器:

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 %> 

视图页面无法正常工作,我得到一个

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

我得到这个为工作删除个人。

回答

1

没有路由问题在这里:)

这仅仅是一个很难理解的,在一REST风格的路由的精妙之处。

如果您运行rake routes,您将看到所有路线的定义。

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 

您会注意到,某些路由没有命名as:

这是因为路由名称与URL路径匹配,而不是控制器或操作。

请注意,使用相同URL路径的路由也使用相同的路由名称。

对于单个路由,单个RESTful路由可以使用4种不同的动词类型(即,GET,POST,PUT/PATCH,DELETE)。

正确的链接代码如下:

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

嘿非常感谢你。你真的帮我解决了这个问题,我解决的另一个问题是我有一个before_action设置个人,但我改变了它:'before_action:set_professor,:except => [:flag,:vote,:destroy] '它现在起作用了。 – tfantina

+0

嘿,没问题,请把这个标记为答案?另外,使用'before_action,expect:[:action]'我发现有一种危险......不确定你的上下文是什么,但我总是执行'before_action,只有:[:action]'。 – fbelanger