Удаление (уничтожение) объекта класса, принадлежащего другому объекту класса - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь удалить объект класса, который принадлежит другому объекту класса, но метод 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 Classes FYI) Кроме того, это находится в моем файле ЖИВОТНОГО 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" %>

Насколько я понимаю, чтобы удалить / уничтожить прицел животного, мне нужно собрать идентификационный номер животного перед удалением прицела, потому что прицел принадлежит животному. Я думал, что делаю это, но, как я сказал выше, кнопка удаления удаляет само животное, а не фактическое конкретное наблюдение.

Заранее спасибо за любую помощь / разъяснения.

1 Ответ

0 голосов
/ 22 марта 2019
class Animal
   has_many :sightings, dependent: :destroy
end

Зависимое уничтожение уничтожит все наблюдения, когда вы уничтожите Animal.

Мне нужно собрать идентификационный номер животного перед удалением визирования, потому что прицел принадлежит животному.

Ложь. Если вы хотите уничтожить один прицел, вам нужен только его идентификатор:

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

кнопка удаления удаляет само животное, а не фактическое конкретное наблюдение

Честно говоря, если вы правильно сделали маршрутизацию, это невозможно. Эта кнопка должна перейти в SightingsController. В вашем SightingsController у вас никогда нет @animal.destroy, что абсолютно необходимо для уничтожения Animal с учетом конфигурации вашей модели.

Вы либо неправильно настроили свои маршруты, либо демонстрируете нам контроллер, отличный от реального.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...