Я получил ошибку «уровень стека слишком глубокий», когда я добавляю следующий код в свой контроллер. Как это исправить?

#ruby-on-rails #stack

#ruby-on-rails #стек

Вопрос:

Я получил ошибку «уровень стека слишком глубокий», когда я добавляю следующий код в свой контроллер. Что не так и как это исправить?

PS: Если я заменю «@survey.вопросы << Question.new(params{})» с «Question.new(params{})» ошибка может быть правильной.

Метод «new» в контроллере:

 def new
  @survey = current_user.surveys.create(:current_user_id => current_user.id, :title => "Untitled Survey", :body => "Survey Description")

  @survey.questions << Question.new(:name => "Example - Single Row Text", :required => true, :input => 'string', :uuid => Time.now.to_i, :position => 1)

  @question = Question.new
  @row = @survey.klass.new

  respond_to do |format|
    if @survey.save
      format.html { redirect_to edit_survey_path(@survey.id, :auth_key => @survey.auth_key)}
      format.json
      format.xml  { render :xml => @survey }
    else
      format.html { redirect_to(surveys_path, :notice => 'Failed to reate survey') }
      format.json
    end
  end
end
 

В вышеупомянутом я стремлюсь создать опрос и связанные с ним вопросы.

Модель для вопроса:

 # coding: utf-8
class Question
  include Mongoid::Document
  include Mongoid::Timestamps
  include BaseModel

  field :title
  field :prompt
  field :required, :type => Boolean, :default => true
  field :unique, :type => Boolean, :default => false
  field :input
  field :uuid
  field :position, :type => Integer
  field :reserve_field
  field :inputable, :type => Boolean, :default => true
  field :other_option, :type => Boolean, :default => false

  embeds_many :options

  attr_protected :user_id
  attr_accessor :current_user_id
  validates_presence_of :user_id, :title, :required, :input
  validates_presence_of :current_user_id, :if => proc { |obj| obj.title_changed? or obj.position_changed? }

  QTYPES = [['text', 'string'],['paragraph_text', 'text'],['multi_choice', 'radio'],['checkbox', 'check'],['choose_from_a_list', 'drop_down'],['page_break', 'pagination']]

  scope :normal, where(:spams_count.lt => Setting.survey_spam_max)
  scope :last_actived, desc(:responsed_at)
  scope :exclude_ids, lambda { |id_array| not_in("_id" => (id_array ||= [])) }
  scope :only_ids, lambda { |id_array| any_in("_id" => (id_array ||= [])) }

  def multi?
    self.input == 'radio' || self.input == 'check'
  end
def update_options(options)
    return true if options.nil? || !options.is_a?(Array)

    self.options.clear

    options.each do |value|
      option = Option.new(:value => value)
      self.options << option
      self.save
    end
  end
end
 

В модели опроса has_many: questions указывает на ассоциации «один ко многим». Кроме того, я определил некоторые функции:

 def klass
  @klass ||= uklass
end

def uklass
  uklass ||= Class.new
  uklass.send(:include, Mongoid::Document)
  uklass.send(:include, Mongoid::Timestamps)
  uklass.collection_name = Time.now.to_s
  #self._id.to_s
  uklass.key "created_at", DateTime
  uklass.class_eval <<-METHOD
    def id
      self._id.to_s
    end

    def persisted?
      !new_record?
    end
  METHOD

  uklass.instance_eval <<-NAME
    def name
      'Row'
    end
  NAME

  #self.questions.each do |question|
    #uklass.key "q#{question.id}", String
    #uklass.validates_presence_of "q#{question.id}".to_sym, :message => I18n.t('activemodel.errors.messages.blank') if question.required_question
    #uklass.validates_uniqueness_of "q#{question.id}".to_sym, :message => I18n.t('activemodel.errors.messages.taken') if question.unique

    #if question.input == 'check' || question.input == 'radio'
      #uklass.class_eval <<-METHOD
        #alias_method :old_q#{question.id}=, :q#{question.id}=
        #def q#{question.id}=(choices)
          #if !choices.is_a?(Array)
            #self.old_q#{question.id}= choices
            #return
          #end
          #if choices.include?('_other')
            #choices.delete('_other')
            #other_options = choices.detect {|c| c.is_a?(Hash)}
            #choices << other_options['other']
          #end

          #choices.reject! {|c| c.is_a?(Hash) || c.blank?}
          #self.old_q#{question.id}= choices.join("n")
        #end
      #METHOD
    #end
  #end
  uklass
  #uklass.new
end
 

Полная трассировка:

 vendor/bundle/ruby/1.9.1/gems/activesupport-3.0.5/lib/active_support/callbacks.rb:425
 

Комментарии:

1. Пожалуйста, опубликуйте модель вашего вопроса и трассировку стека.

2. также было бы удобно иметь модель опроса

Ответ №1:

Обычно это вызвано бесконечным циклом. Не могли бы вы опубликовать часть кода поблизости.

Комментарии:

1. Причиной этого является не бесконечный цикл, а бесконечная или очень глубокая рекурсия.