2012-11-04 14 views
5

Moja aplikacja szyn ma 3 modele. Szlak, region i funkcja. Jestem w stanie współdziałać z tymi modelami w moim katalogu lib/tasks. Użyłem anemonu do przeszukiwania i zapełniania bazy danych. Przykłady połączeń wykonanych na modelach:Szyny: zbyt duży poziom stosu

Trail.find_or_initialize_by_title(detail_title) 

Próbuję teraz napisać kontroler korzystający z modelu.

class TrailController < ApplicationController 
    def index 
     render :json => Trail.all 
    end 
end 

Teraz, jeśli mogę otworzyć szyn konsolę i spróbuj app.get('trail/index') dostanę kod 500 powrotną i widzę następujących w moim development.log

SystemStackError (poziom stos zbyt głęboko):
app/controllers/trail_controller.rb: 23: in 'index'

Więc oczywiście powoduję nieskończoną rekursję. Linia 23 odpowiada treści metody indeksu. Próbowałem już innych modeli w mojej aplikacji: funkcja i region, a wynik jest taki sam. Czy ktoś może mi powiedzieć, co robię źle tutaj, lub w jaki sposób mogę uzyskać więcej śledzenia, aby dowiedzieć się, co dokładnie jest recursing w nieskończoność?

Moje modele są bardzo proste:

class Feature < ActiveRecord::Base 
    attr_accessible :name 
    has_and_belongs_to_many :trails 
    validates :name, :presence => true 
end 

class Region < ActiveRecord::Base 
    attr_accessible :hash_key, :name 
    has_many :trails 
    validates :hash_key, :name, :presence => true 
end 

class Trail < ActiveRecord::Base 
    # attr_accessible :title, :body 
    has_and_belongs_to_many :features 
    validates :title, :presence => true  
end 

Wydaje się to jakoś jest spowodowane przez searchlogic gem. Mam to w mojej Gemfile:

gem 'rd_searchlogic', :require => 'searchlogic', :git => 'git://github.com/railsdog/searchlogic.|~                          

Po zakomentowaniu tego wiersza uruchom instalację pakietu i spróbuj ponownie app.get działa poprawnie. Więc searchlogic w jakiś sposób zakłóca działanie Trail.all. Dlaczego Trail nie będzie działać z zainstalowanym searchlogic?

+0

Co się stanie, jeśli to zrobisz: 'trails = Trail.all; renderować json: trail'? –

+0

Domyślam się, że nadpisałeś as_json lub to_json w jednym z tych modeli. – apneadiving

+0

Próbowałem 'szlaki = Trail.all; render: json => trails' i dostał ten sam błąd. – theraju

Odpowiedz

1

Klejnot rd_searchlogic był źródłem problemu. http://kiranb.scripts.mit.edu/blog/?p=247 mówi o problemie. "Każdy nazwany zasięg, który tworzy Searchlogic, jest dynamiczny i utworzony przez metodę method_missing, a ponieważ Rails 3.1 tak bardzo zmieniło się wokół activerecord, Searchlogic wywołuje brakującą metodę na activerecord, która następnie zostaje przekierowana do searchlogic."

Postanowiłem przejść na meta_where, tylko po to, aby dowiedzieć się, że nie jest on obsługiwany od wersji Rails 3.1. Używam Rails 3.2.8. Squeel jest zamiennikiem i działa świetnie na Railsach 3.2.8: https://github.com/ernie/squeel

Powiązane problemy