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
我相信这对你有帮助。
我有一个包含用户和项目的程序(多对多关系)。我想创建自己的方法:删除特定用户的所有项目和删除特定用户的特定项目,但我无法处理。有(非常大)我不了解路线的可能性。
下面我插入代码以删除特定用户的所有项目。
在我的 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
我相信这对你有帮助。