2011-10-27 8 views
1

コントローラに次のコードを追加すると、「スタックレベルが深すぎます」というエラーが表示されます。 何が問題なのですか?それを修正する方法はありますか?コントローラに次のコードを追加すると「スタックレベルが深すぎます」というエラーが表示されます。それを修正するには?

PS: "Question.new(params {})"で "@ survey.questions < < Question.new(params {})"を置き換えた場合、エラーが正しい可能性があります。

コントローラで「新しい」方法:上記で

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の:質問は1対多の関連を示しています。

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 
+4

質問を投稿してください。モデルとスタックトレースを投稿してください。 –

+1

も調査モデル – danpickett

答えて

0

また、私はいくつかの関数を定義しました。近くにコードの一部を投稿してください。

+2

を持っていると便利です。これは無限ループではなく、無限ループまたは非常に深い再帰を引き起こします。 – tadman

関連する問題