Rails NoMethodError 'каждый' при попытке уничтожить запись

У меня есть приложение rails с некоторыми таблицами (Answer, Question, Project). Ответ связан с вопросом через внешний ключ, мой метод уничтожения в моем контроллере QUESTION определяется так:

def destroy
        @pregunta = Question.find(params[:id])
        @pregunta.destroy
        flash[:danger] = "Se ha borrado la pregunta"
        redirect_to questions_path
    end 

Моя модель ANSWER имеет следующие ограничения:

belongs_to :question, :dependent => :destroy
    has_many :answers_projects, :dependent => :destroy
    has_many :projects, through: :answers_projects, :dependent => :destroy

но когда я пытаюсь вызвать свой метод уничтожения так (на мой взгляд):

<% @preguntas.each do |pregunta| %>
    <tr>
      <td><%= pregunta.question %></td>
      <td><%= pregunta.get_process_name %></td>
      <td><%= pregunta.input %></td>
      <td><%= pregunta.count_op %></td>
      <td><%= pregunta.area %></td>
      <td><%= link_to 'Mostrar', question_path(pregunta), class: "btn btn-xs btn-info" %></td>
      <td><%= link_to 'Editar', edit_question_path(pregunta) , class: "btn btn-xs btn-warning"%></td>
      <td><%= link_to 'DELETE',question_path(pregunta),method: :delete, data: {confirm: '¿Estás seguro de que deseas eliminar la pregunta? Esta acción no se puede deshacer'}, class: "btn btn-xs btn-danger"%></td>

Я могу уничтожить запись в своей среде разработки, но в моей среде развертывания я получаю сообщение об ошибке в своих журналах Heroku:

AnswersProject Load (0.7ms)  SELECT "answers_projects".* FROM "answers_projects" WHERE "answers_projects"."answer_id" = $1  [["answer_id", 95]]
2018-02-02T23:14:19.329550+00:00 app[web.1]: [bb557967-7424-414b-9684-b31ad439936a]    (0.6ms)  ROLLBACK
2018-02-02T23:14:19.337619+00:00 app[web.1]: [bb557967-7424-414b-9684-b31ad439936a] Completed 500 Internal Server Error in 140ms (ActiveRecord: 30.3ms)
2018-02-02T23:14:19.338990+00:00 app[web.1]: [bb557967-7424-414b-9684-b31ad439936a]   
2018-02-02T23:14:19.339160+00:00 app[web.1]: [bb557967-7424-414b-9684-b31ad439936a] NoMethodError (undefined method `each' for #<Answer:0x00000004d173e8>):
2018-02-02T23:14:19.339198+00:00 app[web.1]: [bb557967-7424-414b-9684-b31ad439936a]   
2018-02-02T23:14:19.339242+00:00 app[web.1]: [bb557967-7424-414b-9684-b31ad439936a] app/controllers/questions_controller.rb:77:in `destroy'

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

редактировать полный контроллер вопросов:

class QuestionsController < ApplicationController
    before_action :require_user
    before_action :require_project
    before_action :require_user, except: [:new, :create]
    before_action :current_project, only: [:index]
    def index
        @preguntas = Question.all.order(:process)
        @project_id = request.original_url.split('.').last
        set_current_project(@project_id)
    if(@project_id.include? "http")
    @project_id = "0"
    end
        if(@project_id != "0")
            @proyecto = Project.find(@project_id)
        end 
    end

def show
    @pregunta = Question.find(params[:id])
    @opciones = Option.where(question_id: @pregunta)
end

def new
puts "HELLO EVERYONE NEW QUESTION"
  @pregunta = Question.new
    for option in @pregunta.options
        option.question_id = 1
        option.build
    end
end

def create
puts "HELLO EVERYONE CREATE QUESTION"
    @pregunta = Question.new(pregunta_params)
    if @pregunta.save
    @counter = 0
    @step = 1.to_f / @pregunta.options.count
    for option in @pregunta.options
        @counter = @counter + 1
        if @counter == @pregunta.options.count
            option.update_value(1.to_f)
        else
            option.update_value(@step * @counter)
        end
    end
         redirect_to @pregunta
    else
         render 'new'
    end
end
    def edit
        @pregunta = Question.find(params[:id])
    end 

    def update
puts "HELLO EVERYONE UPDATE UPDATE"
      @pregunta = Question.find(params[:id])
      @pregunta.options.build
      if @pregunta.update(pregunta_params)
        @counter = 0
            @step = 1.to_f / @pregunta.options.count
            for option in @pregunta.options
                @counter = @counter + 1
                if @counter == @pregunta.options.count
                    option.update_value(1.to_f)
                else
                    option.update_value(@step * @counter)
                end
            end
        redirect_to @pregunta
      else
        render 'edit'
      end
    end


     def destroy
        @pregunta = Question.find(params[:id])
        Answer.where(:question_id => @pregunta.id).destroy_all
        @pregunta.destroy
        flash[:danger] = "Se ha borrado la pregunta"
        redirect_to questions_path
    end 

    def require_same_user 
        set_project
        if current_user != @project.user && !@current_user.admin?
            flash[:danger] = "Solo puedes editar tus artículos"
            redirect_to root_path
        end 
    end 

    def require_project
        if current_user.projects.count <1 && !current_user.admin?
            redirect_to root_path
        end 
    end 

    private
        def pregunta_params
            params.require(:question).permit(:question, :value, :process, :area, :input, options_attributes: Option.attribute_names.map(&:to_sym).push(:_destroy))
        end
end

редактировать Полная модель вопроса:

class Question < ApplicationRecord  
    has_many :options, dependent: :destroy
    accepts_nested_attributes_for :options, allow_destroy: true, reject_if: proc { |att| att['description'].blank? }
    validates :question, presence: true
        validates :value, presence: true, length: { minimum: 1 }
        validates :area, presence: true, length: { minimum: 3 }

        def count_op
            Option.where("description IS NOT NULL").where(question_id: self.id).count
        end

        def get_op
            Option.where("description IS NOT NULL").where(question_id: self.id)
        end
        def get_process_name
            case self.process
                when 1 
                    "1 - Identificación de grupo"
                when 2
                    "2 - Reflexión de desarrollo comunitario"
                when 3 
                    "3 - Problemáticas comunitarias - priorización"
                when 4 
                    "4 - Plan de trabajo comunitario"
                when 5 
                    "5 - Desarrollo de actividades y proyectos"
                when 6 
                    "6 - Operación de proyectos y seguimiento a cumplimiento de metas"
                when 7 
                    "7 - Seguimiento a proyectos comunitarios"
                when 8 
                    "8 - Fortalecimiento - operación de grupo"
                when 9 
                    "9 - Capacitación metodológica para vinculación y desarrollo comunitario"
                when 10 
                    "10 - Creación de redes y alianzas comunitarias"
                when 11 
                    "11 - Realización de planes de desarrollo local"
                when 12
                    "12 - Seguimiento a proyectos"
                when 13
                    "13 - Fortalecimiento operación de grupo"
                when 14
                    "14 - Creación de redes y alianzas institucionales"
                else
                    "Error en la fase"
            end
        end
end

person IvanHid    schedule 02.02.2018    source источник
comment
Куда вы перенаправляетесь после уничтожения записей? Как выглядит ваш контроллер?   -  person Sebastian Palma    schedule 03.02.2018
comment
Я перенаправляю обратно на questions_path, я добавил полный Контроллер вопросов   -  person IvanHid    schedule 03.02.2018
comment
Покажите модель Вопроса, скорее всего ошибка в нем.   -  person Bartosz Pietraszko    schedule 03.02.2018
comment
это довольно странно, нигде в показанном вами коде вы не загружаете запись Answer или не вызываете какое-либо отношение ответа. Поэтому я подозреваю, что код на героку не соответствует вашему локальному, или проблема вызвана каким-то кодом, которого мы здесь не видим.   -  person max pleaner    schedule 03.02.2018
comment
какая строка является строкой 77 в QuestionsController?   -  person Pablo    schedule 03.02.2018
comment
Ваша ошибка, вероятно, связана с одним из методов контроллера: уничтожения зависимой модели, который вызывается из-за зависимости уничтожения.   -  person goose3228    schedule 03.02.2018
comment
@BartoszPietraszko Я добавил модель вопроса   -  person IvanHid    schedule 03.02.2018
comment
@maxpleaner код появился после некоторых коммитов в моем репозитории heroku, поэтому я уверен, что он обновлен   -  person IvanHid    schedule 03.02.2018
comment
@Pablo Я только что узнал, что мой контроллер вопросов отличается от того, который я разместил только для этой строки, я обновлю его, сама строка является второй в методе уничтожения: Answer.where(:question_id =› @pregunta.id ).destroy_all   -  person IvanHid    schedule 03.02.2018
comment
@goose3228 goose3228 У меня нет метода уничтожения, определенного в моем контроллере ответов, может ли это быть проблемой?   -  person IvanHid    schedule 03.02.2018
comment
Я предлагаю вам удалить эту строку 73 и все такое. Активная модель Rails предназначена для выполнения рутинной работы, такой как уничтожение зависимых моделей из коробки. Если вы все еще хотите удалить их вручную, удалите :depend =› destroy и попробуйте Answer.destroy_all(question_id: @pregunta.id). И нет, вам не нужен метод destroy в контроллере, чтобы :depend =› :destroy работало.   -  person goose3228    schedule 03.02.2018


Ответы (2)


Я думаю, когда вы создаете свои модели, .answer_projects равно нулю, поэтому, когда он пытается уничтожить .projects, он не может найти каждую из них, связанную с .answer_projects. Попробуйте изменить

has_many :answers_projects, :dependent => :destroy
has_many :projects, through: :answers_projects, :dependent => :destroy

to

has_many :answers_projects
has_many :projects, through: :answers_projects
person thedanotto    schedule 03.02.2018
comment
Если ответов_проектов нет, .answers_projects не равно нулю. Это пустой массив. - person Pablo; 03.02.2018
comment
Я пробовал это, но все еще получаю сообщение об ошибке, моя консоль читает: (PG::ForeignKeyViolation: ОШИБКА: обновление или удаление в вопросах таблицы нарушает ограничение внешнего ключа fk_rails_3d5ed4418f в ответах таблицы - person IvanHid; 03.02.2018
comment
Можете ли вы опубликовать модель ваших вопросов? Хотя бы отношения? - person thedanotto; 03.02.2018
comment
когда вы удаляете вопрос, вы хотите удалить все ответы, связанные с этим вопросом? Возможно, вам придется добавить has_many :answers к вашей модели вопроса. - person thedanotto; 03.02.2018

Почему вы отвечаете на вопрос contains_to :question, :depended => :destroy? Вы хотите уничтожить вопрос, когда вы уничтожаете ответ? Ваш вопрос имеет_много ответов?

Это может быть проблемой.

Если нет, я также нашел некоторые улучшения. Вы определяете множество переменных экземпляра (@project_id, @counter, @step и другие). Вам нужно, чтобы эти переменные были доступны в представлениях? Почему бы вам просто не использовать project_id, counter, step?

ИЗМЕНИТЬ

После того, как вы опубликовали сообщение об ошибке в QuestionsController#destroy: почему бы вам не добавить вопрос has_many :answers depend destroy в вашу модель вопросов? Таким образом, вам не нужен destroy_all, который вы выполняете перед уничтожением Вопроса.

class Question < ApplicationRecord  
  has_many :options, dependent: :destroy
  has_many :answers, dependent: :destroy
  accepts_nested_attributes_for :options, allow_destroy: true, reject_if: proc { |att| att['description'].blank? }
  validates :question, presence: true
  validates :value, presence: true, length: { minimum: 1 }
  validates :area, presence: true, length: { minimum: 3 }

ВопросыКонтроллер

def destroy
  @pregunta = Question.find(params[:id])
  @pregunta.destroy
  flash[:danger] = "Se ha borrado la pregunta"
  redirect_to questions_path
end 
person Pablo    schedule 03.02.2018
comment
Спасибо, что указали на это! Я удалил зависимость в модели ответа, мне нужно, чтобы они динамически заполняли некоторые значения в зависимости от количества существующих параметров. - person IvanHid; 03.02.2018