SystemStackError (слишком большой уровень стека) - PullRequest
6 голосов
/ 29 июня 2011

Я занимаюсь разработкой приложения для Android, и мне нужен ответ json для представления show для сохраненного объекта.Пытаясь это, я получаю:

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

Вот "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

Если я "localhost: 3000 / segnalaziones / 2? Format = xml", xmlпоказал.

Если я "localhost: 3000 / segnalaziones / 2? format = json", я снова получаю страницу с ошибкой (слишком большой уровень стека ...)

Я пробовал это решение, это не работает:

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

РЕШЕНИЕ:

Вместо:

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

I 'мы использовали

 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/

1 Ответ

4 голосов
/ 23 марта 2012

Это проблема переполнения стека.Вы можете проверить размер стека здесь на разных платформах.

ulimit команда, которая в основном обеспечивает контроль над ресурсами, доступными для оболочки, и запускаемыми ею процессами в системах, которые позволяют такой контроль.

Вы можете увидеть текущие ограничения с помощью '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' .

ulimit -s 32768 # устанавливает размер стека 32 Мбайт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...