SystemStackError(堆栈级别太深) [英] SystemStackError (stack level too deep)
问题描述
我正在开发一个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屋!