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.d开发者_运维技巧ove,
@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':
[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
精彩评论