Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SystemStackError (stack level too deep)

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'

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

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

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-too-deep-systemstackerror

SOLUTION:

Instead of:

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

I've used

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

Help found here: http://jonathanjulian.com/2010/04/rails-to_json-or-as_json/

like image 694
Massimo Variolo Avatar asked Jun 29 '11 08:06

Massimo Variolo


1 Answers

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

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

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

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

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

like image 98
Mr. Black Avatar answered Sep 23 '22 21:09

Mr. Black