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

时间:2018-06-12 22:33:18

标签: ruby-on-rails routes 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

第一个选项trows:“没有路由匹配[POST]”/ users /(id)“ 第二种选择什么都不做。

我很感激你的提示。

2 个答案:

答案 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

我相信这可以帮到你。