Уничтожение пользователя в рельсах дает ошибку в зависимых моделях - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь удалить пользователя в моем приложении rails, вызвав @ user.destroy в userscontroller, но он показывает ошибку с зависимыми моделями.

Я использую devise, и я не знаю, есть ли другой способ уничтожения пользователя там. Я попытался изменить на delete_all, но не сработал, затем удалил «зависимый:: уничтожить» на модели пользователя в каждой строке «has_many» и вручную добавил в контроллер код для удаления тех объектов, которые зависят от этого пользователя, но он показывает мне та же ошибка.

user.rb

class User < ApplicationRecord
  extend Devise::Models

  require 'uri'

  has_one_attached :profile_pic

  has_many :comments, dependent: :destroy
  has_many :posts, dependent: :destroy
  has_many :blockeds, class_name: 'block', foreign_key: 'blocked_id', dependent: :destroy
  has_many :owner_blocks, class_name: 'block', foreign_key: 'owner_id', dependent: :destroy
  has_many :followers, class_name: 'follow_user', foreign_key: 'followed_id', dependent: :destroy
  has_many :following, class_name: 'follow_user', foreign_key: 'follower_id', dependent: :destroy
  has_many :taggeds, class_name: 'tag', foreign_key: 'tagged_id', dependent: :destroy
  has_many :taggers, class_name: 'tag', foreign_key: 'tagger_id', dependent: :destroy
  has_many :achievements, through: :achievement_users, dependent: :destroy
  has_many :downvote_comments, dependent: :destroy
  has_many :upvote_comments, dependent: :destroy
  has_many :upvote_posts, dependent: :destroy
  has_many :downvote_posts, dependent: :destroy
  has_many :follow_posts, dependent: :destroy
  has_many :mark_innapropiateds, dependent: :destroy

comment.rb

class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :post

users_controller.rb

def destroy
    @user.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

Миграция за комментарий

class CreateComments < ActiveRecord::Migration[5.2]
  def change
    create_table :comments do |t|
      t.references :user, foreign_key: true
      t.references :post, foreign_key: true
      t.string :content

      t.timestamps
    end
  end
end

index.html.erb (где я вызываю метод уничтожения для пользователя)

        <% @users.each do |user| %>
          <tr>
            <td><%= user.nickname %></td>
            <td><%= user.email %></td>
            <td><%= user.role %></td>
            <td><%= user.last_sign_in_at %></td>
            <td><%= link_to 'Show', user, class: "btn btn-primary" %></td>
            <td>
              <% if user.role=='user' %>
                        <%= form_with(model: user, local: true, action: 'make_admin') do |form| %>
                          <%= form.hidden_field :role, value: 'admin' %>
                          <%= form.submit "Make Admin", class: 'btn btn-primary' %>
                        <% end %>
              <% end %>
            </td>
            <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-primary"%></td>
          </tr>
        <% end %>

Я ожидал, что пользователь будет удален со всеми зависимыми от него объектами (в данном случае их комментариями). Это только показывает мне ошибку с комментариями, но я предполагаю, что это покажет мне ту же ошибку для других моделей. Это ошибка:

SQLite3::ConstraintException: FOREIGN KEY constraint failed: DELETE FROM "comments" WHERE "comments"."id" = ?

УДАЛИТЬ /users/1.json

  def destroy
    @user.destroy (<-- here is remarked)
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
      format.json { head :no_content }

Параметры:

{"_ method" => "delete", "authenticity_token" => "tLUFwuWcM27OKSgrJLoxHTznr82DIFCPFF + InWYnNRpGRyqI5ZIrbUIIP0oaWCB8mVR5mIBI1SPS5E1=n} * * = = 1" = = 1 "= = 1" = = 1 "= = 1" = = = 1 "= = = 1" = = 1 "= = = 1" = = = 1 "= = 1" = = = 1 "= = 1" = = = 1 "= = 1" = = = 1 "= = 1" = = = 1 "= = 1" = = = 1 "= = 1" = = = 1 "= =" 1 = "= 1" = = = 1 "= =" 1 = = 1 "= =" 1 = "= 1" = = "1 =" = 1 = "1 =" = 1 "= =" 1 = "= 1" = "= 1

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

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

0 голосов
/ 12 июня 2019

Ваши upvote_comments и downvote_comments по-прежнему зависят от comment, поэтому вы не можете удалить комментарий, если на него есть ссылки.

Вам необходимо добавить dependent: :destroy к upvote_comments и downvote_comments в ваших комментариях модели.

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