如何在rails中销毁与登录用户相关的所有任务
Posted
技术标签:
【中文标题】如何在rails中销毁与登录用户相关的所有任务【英文标题】:how can destroy all task linked to login user in rails 【发布时间】:2021-11-05 05:30:23 【问题描述】:我正在尝试删除与登录用户相关联的所有任务,但是当我单击删除所有按钮时,它会显示错误
No route matches [POST] "/tasks/destroy_all"
task_controller.rb
class TaskController < ApplicationController
def all_destory
@user = current_user
@user.tasks.destroy_all
redirect_to user_tasks_path
end
end
路由.rb
get '/tasks/destroy_all', to: 'task#all_destory', as: :destroy_all
<% @tasks.each do |task| %>
<%= task.daily_task %>
<%= task.date %>
<% end%>
<%= button_to "delete all", destroy_all_path %>
【问题讨论】:
【参考方案1】:在销毁记录时,您想使用DELETE
HTTP 动词。
GET 请求保存在浏览器历史记录中,不应在服务器上创建、修改或销毁任何内容。
通常在 Rails 中,您只有一条路径可以销毁单个记录。但是如果DELETE /things/1
删除了单个资源,那么DELETE /things
应该在逻辑上销毁整个集合:
get '/user/tasks', to: 'users/tasks#index', as: :user_tasks
delete '/user/tasks', to: 'users/tasks#destroy_all'
# app/controllers/users/tasks_controller.rb
module Users
class TasksController < ApplicationRecord
before_action :authenticate_user!
# display all the tasks belonging to the currently signed in user
# GET /user/tasks
def index
@tasks = current_user.tasks
end
# destroy all the tasks belonging to the currently signed in user
# DELETE /user/tasks
def destroy_all
@tasks = current_user.tasks
@tasks.destroy_all
redirect_to action: :index
end
private
# You don't need this if your using Devise
def authenticate_user!
unless current_user
redirect_to '/path/to/your/login',
notice: 'Please sign in before continuing'
end
end
end
end
<%= button_to "Delete all", user_tasks_path, method: :delete %>
【讨论】:
***.com/questions/69164369/…【参考方案2】:你的 HTTP 动词和你的路由必须匹配。目前您的按钮使用POST
,但您的路线接受GET
。您可以将它们都更改为POST
。
post '/tasks/destroy_all', to: 'task#all_destory', as: :destroy_all
这解决了问题中的问题,但并不理想。正如@max 指出的那样,DELETE
将更能传达单击按钮的作用——删除资源。
DELETE documentation
【讨论】:
它只是从tasks表中删除了user_id,但task仍在db表中 @MuhammadUsman 这听起来像是一个不同的问题。这个答案是否允许您通过单击“全部删除”按钮来调用控制器方法? 我是新手,我认为它允许在路径上调用控制器方法 您可以输入调试器语句,如 (pry 或 byebug) 或只是puts 'called all_destory'
来确认。
虽然这解决了眼前的问题,但它不是很好。 Rails 风格的 REST 中的 POST 意味着您正在创建资源。每当您添加 destroy
、create
或 update
作为路径的一部分时,一只小猫就会死去。以上是关于如何在rails中销毁与登录用户相关的所有任务的主要内容,如果未能解决你的问题,请参考以下文章
Rails - 如何覆盖设计SessionsController以在用户登录时执行特定任务?