SystemStackError(堆栈级别太深) [英] SystemStackError (stack level too deep)

查看:175
本文介绍了SystemStackError(堆栈级别太深)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个android应用,我需要对show视图的json响应有关已保存的对象.尝试一下,我收到:

I'm developing an android app, and I need to have a json response of the show view about a saved object. Trying that, I receive:

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

这是"Segnalazione"控制器

Here is the "Segnalazione" controller

include Gft

class SegnalazionesController < ApplicationController

  load_and_authorize_resource  
  respond_to :json
  # GET /segnalaziones
  # GET /segnalaziones.xml
  # before_filter :authorize

  def index
    @segnalaziones = Segnalazione.order(:dataspedizione)
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @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.

If I "localhost:3000/segnalaziones/2?format=xml", the xml is showed.

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

If I "localhost:3000/segnalaziones/2?format=json" I receive again the error page (stack level too deep ... )

我已经尝试过这种解决方案,但不起作用:

I've tried this solutions, that doesn't work:

http://dalibornasevic.com/posts/5- ruby-stack-level-deep-system-stackerror

解决方案:

代替:

 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/

推荐答案

这是堆栈溢出问题.您可以在各种平台上的此处检查堆栈大小.

This is the Stack Overflow Problem. You can check the stack size here on various platforms.

ulimit 命令,该命令基本上可以控制可用资源在允许此类控制的系统上访问Shell及其启动的进程.

ulimit command which basically provides control over the resources available to the shell and processes started by it, on systems that allow such control.

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

You can see the current limits with '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'命令更改堆栈大小.

And, you can change the stack size using 'ulimit -s' command.

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

ulimit -s 32768 # sets the stack size to 32M bytes

这篇关于SystemStackError(堆栈级别太深)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆