5

我的 Rails 应用程序有 3 个模型。足迹、区域和特征。我可以在我的 lib/tasks 目录中很好地与这些模型进行交互。我使用海葵来抓取和填充数据库。我对模型进行的调用示例:

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:in `index'

所以我显然导致了一些无限递归。第 23 行对应于 index 方法的主体。我在我的应用程序中尝试了其他模型:Feature 和 Region,结果是一样的。有人可以告诉我我在这里做错了什么,或者我如何获得更多跟踪以找出究竟是什么无限递归?

我的模型非常简单:

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 的情况下工作?

4

1 回答 1

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

于 2012-11-06T06:09:33.773 回答