ruby-on-rails - 自定义方法和 link_to

ruby-on-rails - custom method and link_to

我有一个包含用户和项目的程序(多对多关系)。我想创建自己的方法:删除特定用户的所有项目和删除特定用户的特定项目,但我无法处理。有(非常大)我不了解路线的可能性。

下面我插入代码以删除特定用户的所有项目。

在我的 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

第一个选项行:"No route matches [POST] "/users/(id)” 第二种选择什么也不做。

如有提示,将不胜感激

为此

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?' } %>

在您的路线中,您将路线定义为 post,所以它应该是

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修改为

<%= link_to 'Delete all projects', delete_projects_from_user(@user), method: :delete, data: { confirm: 'Are you sure?' } %>

两个都可以,推荐带delete的第2个

基本格式:

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

我相信这对你有帮助。