【问题标题】:ruby-on-rails - custom method and link_toruby-on-rails - 自定义方法和 link_to
【发布时间】:2018-11-22 09:59:37
【问题描述】:

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

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

在我的 user_controller.rb 我有:

def delete_projects_from_user
    @user.projects.delete_all
end

在 show.html.erb 链接到:

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

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

我将不胜感激。

【问题讨论】:

    标签: ruby-on-rails routes link-to


    【解决方案1】:

    基本格式:

    <%= link_to 'DISPLAY TEXT', YOUR_ROUTE_path(@object), method:
     :HTTP_METHOD, data: { Additional html params } %>
    

    解决办法如下:

    &lt;%= link_to 'Remove All Projects', delete_projects_from_user_path(@user), method: :post, data: { confirm: 'Are you sure?' } %&gt;

    然后在你的方法中:

     def delete_projects_from_user
       user = user.find(params[:id])
       user.projects.delete_all
       redirect_to :back #if nothing to render  
     end
    

    我相信这会对你有所帮助。

    【讨论】:

    • 我有“未定义的方法`delete_projects_from_user'”
    • @Weronika 试试这个delete_projects_from_user_path(@user) 否则签入rake routes 您将获得该路线中的所有路线,在最后添加_path 并尝试。 &lt;%= link_to 'Remove All Projects', delete_projects_from_user_path(@user), method: :post, data: { confirm: 'Are you sure?' } %&gt;
    • 错误消失了,但现在什么也没有发生。
    • 检查控制器方法是否正确定义?
    • 我尝试了两个版本 - 主要的和你的。 class UsersController &lt; ApplicationController before_action :set_user, only: [:show, :edit, :update, :destroy] def delete_projects_from_user @user.projects.delete_all end
    【解决方案2】:

    为此

    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
    

    至于第二个选项,你也可以使用collection

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

    两个选项都可以,推荐第二个带删除的选项

    【讨论】:

    • 它会删除用户,但我想删除特定用户和项目之间的所有关联,而不是对象。
    • 使用 .destroy_all 应该删除对象及其所有关联
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多