我的rails应用程序有3个型号。小道,地区和特色。我可以在lib / tasks目录中很好地与这些模型进行交互。我用anemone来抓取并填充数据库。我在模型上调用的示例:
Trail.find_or_initialize_by_title(detail_title)
我现在正在尝试编写一个使用该模型的控制器。
class TrailController < ApplicationController
def index
render :json => Trail.all
end
end
现在,如果我打开rails控制台并尝试app.get('trail/index')
,我会收到500返回码,我在development.log
SystemStackError(堆栈级别太深):
app / controllers / trail_controller.rb:23:在`index&#39;
所以我显然会导致一些无限递归。第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 gem引起的。我在我的Gemfile中有这个:
gem 'rd_searchlogic', :require => 'searchlogic', :git => 'git://github.com/railsdog/searchlogic.|~
当我注释掉那一行时,运行bundle install并重试app.get工作正常。所以searchlogic以某种方式干扰了Trail.all。为什么不使用Trail.all来安装searchlogic?
答案 0 :(得分: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