#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. Причиной этого является не бесконечный цикл, а бесконечная или очень глубокая рекурсия.