删除(销毁)属于另一个类对象的类对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除(销毁)属于另一个类对象的类对象相关的知识,希望对你有一定的参考价值。

我试图删除属于另一个类对象的类对象,但destroy方法实际上是删除has_many的类对象而不是删除单挑的belongs_to类对象。我在这里错过了什么?

Animal.rb

class Animal < ApplicationRecord
    has_many :sightings, dependent: :destroy
end

Sightings.rb

class Sighting < ApplicationRecord
    belongs_to :animal
end

瞄准控制器

class SightingsController < ApplicationController

    def index
        @sightings = Animal.sightings.all
    end

    def create
        @animal = Animal.find(params[:animal_id])
        @sighting = @animal.sightings.create(sighting_params)
        redirect_to @animal
    end

    def new
        @animal = Animal.find(params[:animal_id])
        @sighting = @animal.sightings.create(sighting_params)
    end

    def edit
        @animal = Animal.find(params[:animal_id])
        @sighting = @animal.sightings.find(params[:id])
    end

    def update
        @animal = Animal.find(params[:animal_id])
        @sighting = @animal.sightings.find(params[:id])

        if @sighting.update_attributes(sighting_params)
            redirect_to @animal
        else
            redirect_to 'edit'
        end
    end

    def destroy
        @animal = Animal.find(params[:animal_id])
        @sighting = Sighting.find(params[:id])
        @sighting.destroy

        redirect_to root_path
    end

    private

    def sighting_params
        params.require(:sighting).permit(:animal_id, :date, :time, :latitude, :longitude)
    end
end

删除按钮(使用Bulma类FYI)此外,它位于我的ANIMAL show.html.erb文件中。

<%= link_to "Delete Sighting ID#: #{sighting.id}", sighting_path(sighting), method: :delete, data: { confirm: "Are you sure you want to delete this sighting?" }, class: "button is-danger" %>

据我了解,为了删除/破坏动物的目击,我需要在删除目击之前收集动物ID,因为目击属于动物。我以为我这样做但是如上所述,删除按钮正在删除动物本身,而不是实际的特定目击。

在此先感谢任何帮助/澄清。

答案
class Animal
   has_many :sightings, dependent: :destroy
end

当你摧毁Animal时,相依的毁灭将摧毁所有的目击。

我需要在删除瞄准之前收集动物ID,因为瞄准属于动物。

假。如果你想破坏一次目击,你只需要它的ID:

def destroy
  @sighting = Sighting.find(params[:id])
  @sighting.destroy
end

删除按钮正在删除动物本身,而不是实际的特定目击

坦率地说,如果你已经正确完成了路由,这是不可能的。该按钮应该转到SightingsController。在你的SightingsController中,你永远不会有@animal.destroy,这对于在你的模型配置下摧毁Animal是绝对必要的。

您要么错误配置了路线,要么向我们展示了与真实路线不同的控制器。

以上是关于删除(销毁)属于另一个类对象的类对象的主要内容,如果未能解决你的问题,请参考以下文章

类对象和包

JavaScript:通过类方法创建和销毁类实例

访问另一个类的 main 中定义的类的实例

使用另一个类的对象的类构造函数

设计模式——单例模式

组合类详解