2011-06-29 10 views
5

Estoy desarrollando una aplicación de Android, y necesito tener una respuesta json de la vista de programa sobre un objeto guardado. Tratando de que, recibo:SystemStackError (nivel de pila demasiado profundo)

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

Aquí es el controlador "segnalazione"

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 

Si "localhost: 3000/segnalaziones/2 = formato XML", el xml se mostró.

Si "localhost: 3000/segnalaziones/2 = formato JSON" Recibo de nuevo la página de error (nivel demasiado profundo ...)

He intentado estas soluciones, que no funciona :

http://dalibornasevic.com/posts/5-ruby-stack-level-too-deep-systemstackerror

SOLUCIÓN:

En lugar de:

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

He usado

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

Ayuda encontrar aquí: http://jonathanjulian.com/2010/04/rails-to_json-or-as_json/

+1

1 para un problema de desbordamiento de pila en desbordamiento de pila –

Respuesta

5

Este es el desbordamiento de pila problema. Puede verificar el tamaño de la pila here en varias plataformas.

comando

ulimit que proporciona básicamente el control sobre los recursos disponibles para el shell y los procesos iniciados por que, en los sistemas que permiten a dicho control.

Se puede ver los límites de corriente con 'ulimit -a':

[[email protected] /]# 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 

Y, se puede cambiar el tamaño de la pila utilizando 'ulimit -s' comando.

ulimit -s 32768 # establece el tamaño de la pila de 32M bytes

Cuestiones relacionadas