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/
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’:
And, you can change the stack size using ‘ulimit -s’ command.