2012-11-04 71 views
5

我的Rails應用程序有3個模型。路徑,地區和特徵。我能夠在我的lib/tasks目錄中很好地與這些模型進行交互。我用anemone爬行並填充數據庫。我在模型上撥打的電話示例如下:Rails:堆棧級別太深錯誤

Trail.find_or_initialize_by_title(detail_title) 

我正在嘗試編寫使用該模型的控制器。

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

現在,如果我打開軌道控制檯,並嘗試app.get('trail/index')我得到了500返回碼,我看到在我development.log

SystemStackError(堆棧級別太深)以下:
應用程序/控制器/ trail_controller.rb:23:在'index'中

所以我顯然會導致一些無限遞歸。第23行對應於索引方法的主體。我試過我的應用中的其他模型:特徵和區域,結果是一樣的。有人能告訴我我在這裏做錯了什麼,或者我可以如何得到更多的追蹤來確定無限遞歸是什麼?

我的模型很簡單:

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 

看來這是某種由searchlogic寶石造成的。我有這個在我的Gemfile:

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

當我註釋掉該行,運行捆綁安裝,然後重試app.get事情做工精細。所以searchlogic會以某種方式干擾Trail.all。爲什麼Trail.all不能使用searchlogic安裝?

+0

如果你這樣做會發生什麼:'trails = Trail.all;渲染JSON:Trails'? –

+0

我想你在這些模型之一覆蓋了as_json或to_json。 – apneadiving

+0

我試過'trails = Trail.all; render:json => trails'並得到相同的錯誤。 – theraju

回答

1

rd_searchlogic gem是問題的根源。 http://kiranb.scripts.mit.edu/blog/?p=247談論這個問題。 「任何命名範圍Searchlogic創建的都是動態的,並且通過method_missing創建,並且因爲Rails 3.1在activerecord周圍發生了很大變化,所以Searchlogic在activerecord上調用缺少的方法,然後將其重新路由到searchlogic。」

我決定切換到meta_where,只是爲了瞭解它不支持從Rails 3.1開始。我正在運行Rails 3.2.8。 Squeel是替代品,並且在Rails 3.2.8上效果很好:https://github.com/ernie/squeel