SystemStackError(堆栈级别太深)

我正在开发一个Android应用程序,我需要有关于已保存对象的show视图的json响应。 试着这样,我收到:

"SystemStackError (stack level too deep)" app/controllers/segnalaziones_controller.rb:74:in `create' app/controllers/segnalaziones_controller.rb:58:in `create' 

这是“Segnalazione”控制器

 include Gft class SegnalazionesController  @segnalaziones } format.json { render :json => @segnalaziones } end end # GET /segnalaziones/1 # GET /segnalaziones/1.xml def show @segnalazione = Segnalazione.find(params[:id]) respond_to do |format| format.html # show.html.erb format.xml { render :xml => @segnalazione } format.json { render :json => @segnalazione } end end # GET /segnalaziones/new # GET /segnalaziones/new.xml def new @segnalazione = Segnalazione.new respond_to do |format| format.html # new.html.erb format.xml { render :xml => @segnalazione } format.json { render :json => @segnalazione } end end # GET /segnalaziones/1/edit def edit @segnalazione = Segnalazione.find(params[:id]) end # POST /segnalaziones # POST /segnalaziones.xml def create @segnalazione = Segnalazione.new(params[:segnalazione]) @user = User.find_by_id(session[:user_id]) @username = session[:user_name] @segnalazione.user = session[:user_id] @segnalazione.dataspedizione = Time.zone.now @user.last_request_at = Time.zone.now @user.save respond_to do |format| if @segnalazione.save Gft.spedisci( @segnalazione.id, @username, @segnalazione.mood, @segnalazione.dove, @segnalazione.via, @segnalazione.dataspedizione, @segnalazione.descrizione, @segnalazione.immagine.url, @segnalazione.categoria1, @segnalazione.categoria2, @segnalazione.categoria3) format.html { redirect_to(@segnalazione, :notice => 'Segnalazione creata, verrà visualizzata su mappa fra qualche attimo') } format.xml { render :xml => @segnalazione, :status => :created, :location => @segnalazione } format.json { render :json => @segnalazione, :status => :created, :location => @segnalazione } else format.html { render :action => "new" } format.xml { render :xml => @segnalazione.errors, :status => :unprocessable_entity } format.json { render :json => @segnalazione.errors, :status => :unprocessable_entity } end end end # PUT /segnalaziones/1 # PUT /segnalaziones/1.xml def update @username = session[:user_name] @segnalazione = Segnalazione.find(params[:id]) respond_to do |format| if @segnalazione.update_attributes(params[:segnalazione]) Gft.aggiorna( @segnalazione.id, @username, @segnalazione.mood, @segnalazione.dove, @segnalazione.via, @segnalazione.dataspedizione, @segnalazione.datarisoluzione, @segnalazione.descrizione, @segnalazione.immagine.url, @segnalazione.categoria1, @segnalazione.categoria2, @segnalazione.categoria3) format.html { redirect_to(@segnalazione, :notice => 'Segnalazione aggiornata') } format.xml { head :ok } else format.html { render :action => "edit" } format.xml { render :xml => @segnalazione.errors, :status => :unprocessable_entity } end end end # DELETE /segnalaziones/1 # DELETE /segnalaziones/1.xml def destroy @segnalazione = Segnalazione.find(params[:id]) @segnalazione.destroy Gft.elimina(@segnalazione.id) respond_to do |format| format.html { redirect_to(admin_url) } format.xml { head :ok } end end def eliminadatarisoluzione @segnalazione.datarisoluzione = nil end end 

如果我“localhost:3000 / segnalaziones / 2?format = xml”,则会显示xml。

如果我“localhost:3000 / segnalaziones / 2?format = json”我再次收到错误页面(堆栈级别太深……)

我试过这个解决方案,但不起作用:

http://dalibornasevic.com/posts/5-ruby-stack-level-too-deep-systemstackerror

解:

代替:

  format.json { render :json => @segnalazione, :status => :created, :location => @segnalazione } 

我用过

  format.json { render :json => @segnalazione.as_json(:only => [:user, :categoria1, :categoria2, :categoria3, :descrizione, :dove, :via]), :status => :created, :location => @segnalazione } 

在此处找到帮助: http : //jonathanjulian.com/2010/04/rails-to_json-or-as_json/

这是堆栈溢出问题。 您可以在各种平台上查看堆栈大小。

ulimit命令基本上在允许这种控制的系统上提供对shell可用资源及其启动的进程的控制。

您可以使用’ulimit -a’查看当前限制:

 [mrblack@ /]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 15910 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 

并且,您可以使用‘ulimit -s’命令更改堆栈大小。

ulimit -s 32768#将堆栈大小设置为32M字节