【问题标题】:Cannot delete records in Rails无法删除 Rails 中的记录
【发布时间】:2019-12-07 03:42:14
【问题描述】:

我有三个模型:项目、团队和用户。

团队有很多相关的项目。

在我的项目定义中,我想删除与项目关联的团队,但单击删除时没有任何反应。

我的destroy def如下:

def destroy
  @project = Project.find(params[:id])
  @team = project.team
  @project.destroy
  # edit #1 shown below:
  respond_to do |format|
    format.html { redirect_to @team, notice: 'Project was successfully destroyed.' }
  end
end

并在 show.erb.html 中制作按钮以删除项目并链接回项目路径

<%= link_to 'Delete Project', project_path(@project), data: { confirm: 'Are you sure'}, method: :destroy, class:'button is-danger is-outlined' %>
                        </div>

路线:

Rails.application.routes.draw do
  resources :projects
  resources :teams
  as :user do
    put '/user/confirmation' => 'confirmations#update', :via => :patch, :as => :update_user_confirmation
  end



   devise_for :users, controllers: {
    registrations: 'registrations',
    confirmations: 'confirmations'
  }
  devise_scope :user do  
    get '/users/sign_out' => 'devise/sessions#destroy'     
  end
  root 'home#index'
end

我对 Rails 还是很陌生,找不到发生这种情况的原因。

编辑 2 - 更多细节

项目控制器如下:

class ProjectsController < ApplicationController
  before_action :set_project, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, only: [:edit, :update, :destroy]

  # GET /projects
  # GET /projects.json
  def index
    @projects = Project.all.order('created_at DESC')
  end

  # GET /projects/1
  # GET /projects/1.json
  def show
  end

  # GET /projects/new
  def new
    @project = current_user.projects.build
    @teams = Team.where('id = ?', current_user.team_id)
  end

  # GET /projects/1/edit
  def edit
    @teams = current_user.teams
  end

  # POST /projects
  # POST /projects.json
  def create
    @project = current_user.projects.build(project_params)

    respond_to do |format|
      if @project.save
        format.html { redirect_to @project, notice: 'Project was successfully created.' }
        format.json { render :show, status: :created, location: @project }
      else
        format.html { render :new }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /projects/1
  # PATCH/PUT /projects/1.json
  def update
    respond_to do |format|
      if @project.update(project_params)
        format.html { redirect_to @project, notice: 'Project was successfully updated.' }
        format.json { render :show, status: :ok, location: @project }
      else
        format.html { render :edit }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /projects/1
  # DELETE /projects/1.json
  def destroy
    @project = Project.find(params[:id])
    @team = project.team
    @project.destroy
    # edit #1 shown below:
    respond_to do |format|
      format.html { redirect_to @team, notice: 'Project was successfully destroyed.' }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_project
      @project = Project.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def project_params
      params.require(:project).permit(:name, :description, :team_id)
    end
end

【问题讨论】:

  • 您是否收到任何类型的错误?您正在尝试删除项目,而不是与其关联的团队,并且您还试图重定向到您刚刚销毁的项目。尝试在 rails 协会文档中查找 dependent: :destroy
  • 试试@project.destroy!,如果失败会抛出异常。

标签: ruby-on-rails


【解决方案1】:

删除资源后重定向到该资源不起作用,因为该资源不再存在。因此,控制器操作可能应该重定向到已删除的项目团队:

def destroy
  @project = Project.find(params[:id])
  @team = project.team
  @project.destroy
  # edit #1 shown below:
  respond_to do |format|
    format.html { redirect_to @team, notice: 'Project was successfully destroyed.' }
  end
end

那么你的link_to 应该使用method: :deleteNOT method: :destroy:

<%= link_to 'Delete Project', project_path(@project), data: { confirm: 'Are you sure'}, method: :delete, class:'button is-danger is-outlined' %>

参考:https://api.rubyonrails.org/v5.2.3/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to-label-Options

看看这是否能让你继续前进,如果没有,请分享一些调试信息。

编辑#1: 在您的控制器销毁操作中,您需要做更多的工作来处理 Rails 如何响应请求。我之前没有注意到它丢失了,但是该操作应该有一个 respond_to 块,您可以在其中选择基本上以不同的方式响应。我修改了上面的控制器动作代码给你一个例子。

【讨论】:

  • 感谢您的回复 Ben,我已经更改了这两点,不幸的是,我没有收到任何错误(我已经尝试过 @project.destroy!正如其他人建议的那样,但没有错误),我是当我单击删除按钮时收到 GET 请求,所以我想知道这是否与我的路线有关?我已经在上面列出了我的路线。 ``` 于 2019-12-08 11:09:26 +1300 开始 GET "/projects/1" for ::1 ```
  • @basic 你确定你的终端/bash 没有显示任何错误吗? puma 服务器应该在那里输出关于任何数据库查询的反馈,以及每次发出请求时都会出现的错误。另外,您可以添加整个项目控制器代码(只是项目控制器,而不是项目中的所有控制器)?顺便说一句,我刚刚注意到您需要更改的其他内容。请参阅我的答案编辑。
  • 绝对不会出现错误。当我点击删除按钮时,似乎正在重新加载。我刚刚在我的原始帖子中添加了项目控制器,并进行了您在帖子中所述的更改。
  • 听起来好像因为某种原因没有采用 link_to 的方法,所以它可能只是渲染了 show 动作。 rails routes 命令的输出是什么?此外,您确实需要弄清楚如何共享来自您的 rails 服务器的显示正在发出的请求的输出。目前我没有看到明显的错误,我们需要知道发出请求时发生了什么。除非你明白,否则我帮不了你。 guides.rubyonrails.org/debugging_rails_applications.html