在基本索引表单上实现删除所有选项的正确方法是什么

时间:2015-02-07 05:01:25

标签: ruby-on-rails

我的用户有帖子。

<p id="notice"><%= notice %></p>                                                                                                                                                                                  

<h1>Listing Posts</h1>                                                                                                                                                                                         

<table>                                                                                                                                                                                                           
  <thead>                                                                                                                                                                                                         
    <tr>                                                                                                                                                                                                          
      <th>Comment</th>                                                                                                                                                                                            
      <th colspan="3"></th>                                                                                                                                                                                       
    </tr>                                                                                                                                                                                                         
  </thead>                                                                                                                                                                                                        

  <tbody>                                                                                                                                                                                                         
    <% @posts.each do |post| %>                                                                                                                                                                             
      <tr>                                                                                                                                                                                                        
        <td><%= post.content %></td>                                                                                                                                                                           
        <td><%= link_to 'Show', post %></td>                                                                                                                                                                   
        <td><%= link_to 'Edit', edit_post_path(post) %></td>                                                                                                                                                
        <td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td>                                                                                                           
      </tr>                                                                                                                                                                                                       
    <% end %>                                                                                                                                                                                                     
  </tbody>                                                                                                                                                                                                        
</table>                                                                                                                                                                                                          

<br>                                                                                                                                                                                                              

<%= link_to 'New Post', new_user_post_path %>  

在控制器中

 def destroy                                                                                                                                                                                                     
    @user = @post.user                                                                                                                                                                                         
    @post.destroy                                                                                                                                                                                              
    respond_to do |format|                                                                                                                                                                                        
      format.html { redirect_to user_posts_url(@user), notice: 'Post was successfully destroyed.' }                                                                                                         
      format.json { head :no_content }                                                                                                                                                                            
    end                                                                                                                                                                                                           
  end  

实施链接和控制器操作以销毁特定用户的所有帖子的正确方法是什么?

修改 配置/ routes.rb中

resources :users do 
  resources :posts, shallow: true 
end

编辑2:

 resources :users do                                                                                                                                                                                             
    #resources :posts, shallow: true                                                                                                                                                                           
    resources :posts, shallow: true do                                                                                                                                                                         
      delete :destroy_all, on: collection                                                                                                                                                                         
    end                                                                                                                                                                                                           
  end 

给出no block given (yield)错误

aww my bad ..刚发现错误..忘了添加:收藏

3 个答案:

答案 0 :(得分:2)

如果需要删除选定的帖子,我只会传递一组post ID 。如果您要删除特定用户的所有帖子,那么我将采用以下方式:

<强>配置/ routes.rb中

resources :users do
  resources :posts do
    delete :destroy_all, on: :collection
  end
end

此处,on: :collection表示该路由适用于帖子的集合;因此,路线看起来像这样:

/users/:user_id/posts/destroy_all

您可以在Rails指南中阅读有关添加成员和收集路由的更多信息:

http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

应用/控制器/ posts_controller.rb

def destroy_all
  user = User.find(params[:user_id])
  user.posts.destroy_all
  # redirect somewhere
end

应用/视图/帖/ index.html.erb

<%= link_to(
  "Delete all posts!", 
  destroy_all_user_posts_path, 
  method: :delete
) %>

如果您要删除current_user的所有帖子,请按以下方式修改:

<强>配置/ routes.rb中

resources :posts do
  delete :destroy_all, on: :collection
end

应用/控制器/ posts_controller.rb

def destroy_all
  current_user.posts.destroy_all
  # redirect somewhere
end

应用/视图/帖/ index.html.erb

<%= link_to(
  "Delete all posts!", 
  destroy_all_posts_path, 
  method: :delete
) %>

希望有所帮助。

答案 1 :(得分:0)

我会创建一个单独的控制器方法,接受一个post id数组。

<强> posts_controller.rb

def destroy_all                                                                                                                                                                                                     
  posts = Post.where(:id => params[:post_ids])
  posts.delete_all                                                                                                                                                                                    
  redirect_to :back                                                                                                                                                                                                         
end 

您还需要向view方法提供ID。

<强> posts_controller.rb

def index
  ...
  @posts_ids = Post.find(... how ever you need to select all posts...).pluck(:id)
  ...
end

<强>视图/帖/ index.html.erb

...
<%= link_to destroy_all_posts_path(:post_ids => @posts_ids), :method => :destroy %>
...

您还需要提供路线。

<强>的routes.rb

resources :users do
  resources :posts
    delete :destroy_all
  end
end

那应该是它:)

答案 2 :(得分:0)

您可以使用:

def destory_posts(user)
 user.posts.destroy_all
 render :nothing => true
end

将此方法添加到routes文件中。 从您要删除帖子的位置创建destory_posts_path(current_user)之类的链接。