我有一个包含用户和项目的程序(多对多关系)。我想创建自己的方法:从特定用户删除所有项目并从特定用户删除特定项目,但我无法处理。有(安静的大)可能性我不明白路线。
下面我插入代码以删除特定用户的所有项目。
在我的user_controller.rb中,我有:
def delete_projects_from_user
@user.projects.delete_all
end
在show.html.erb link_to:
<%= link_to 'Delete all projects', @user, method: :delete_projects_from_user, data: { confirm: 'Are you sure?' } %>
在路线中,我尝试了其中两个选项:
resources :users do
get 'delete_projects_from_user', on: :member
end
或
post '/users/:id', to: 'users#delete_projects_from_user', as: :delete_projects_from_user
第一个选项trows:“没有路由匹配[POST]”/ users /(id)“ 第二种选择什么都不做。
我很感激你的提示。
答案 0 :(得分:0)
对于此
def delete_projects_from_user
@user.projects.delete_all
end
您最好使用.destroy_all来确保此对象及其所有相关项目也被销毁
.delete_all只删除对象,并在数据库中保留相关条目
至于此:
<%= link_to 'Delete all projects', @user, method: :delete_projects_from_user, data: { confirm: 'Are you sure?' } %>
在您的路线中,您将路线定义为帖子,因此应该
method: :post
就像这样
<%= link_to 'Delete all projects', @user, method: :post, data: { confirm: 'Are you sure?' } %>
在这里你没有正确添加路线,它应该是这样的
<%= link_to 'Delete all projects', YOUR_ROUTE_path(@user), method: :post, data: { confirm: 'Are you sure?' } %>
虽然建议像这样定义这条路线
delete '/users/:id', to: 'users#delete_projects_from_user', as: :delete_projects_from_user
对于第二个选项,您也可以使用集合
resources :users do
collection do
delete 'user/:id', to: 'users#delete_projects_from_user', as: :delete_projects_from_user
end
end
并修改链接
<%= link_to 'Delete all projects', delete_projects_from_user(@user), method: :delete, data: { confirm: 'Are you sure?' } %>
两个选项都很好,第二个有删除的是推荐的
答案 1 :(得分:0)
基本格式:
<%= link_to 'DISPLAY TEXT', YOUR_ROUTE_path(@object), method:
:HTTP_METHOD, data: { Additional html params } %>
以下是解决方案:
<%= link_to 'Remove All Projects', delete_projects_from_user_path(@user), method: :post, data: { confirm: 'Are you sure?' } %>
然后在你的方法中:
def delete_projects_from_user
user = user.find(params[:id])
user.projects.delete_all
redirect_to :back #if nothing to render
end
我相信这可以帮到你。