【问题标题】:I got "stack level too deep" error when I add following code in my controller. How to fix it?在控制器中添加以下代码时出现“堆栈级别太深”错误。如何解决?
【发布时间】:2011-12-16 13:46:44
【问题描述】:

在控制器中添加以下代码时出现“堆栈级别太深”错误。 出了什么问题以及如何解决?

PS:如果我将“@survey.questions

控制器中的“新”方法:

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

【问题讨论】:

  • 请发布您的问题模型和堆栈跟踪。
  • 拥有调查模型也很方便

标签: ruby-on-rails stack


【解决方案1】:

这通常是由无限循环引起的。你能不能把一些代码贴在附近。

【讨论】:

  • 导致这种情况的不是无限循环,而是无限或非常深的递归。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
相关资源
最近更新 更多