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

时间:2019-03-22 19:53:03

标签: ruby-on-rails activerecord

我正在尝试删除属于另一个类对象的类对象,但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

删除按钮(使用布尔玛类供参考) 此外,该文件位于我的动物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,因为该目击者属于该动物。我以为我是在这样做,但是正如我在上面说的那样,删除按钮是删除动物本身,而不是实际的特定瞄准点。

在此先感谢您的帮助/说明。

1 个答案:

答案 0 :(得分:0)

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而言绝对是给定模型配置所必需的。

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