Rails: слишком глубокая ошибка уровня стека

В моем приложении 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: в `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. У меня есть это в моем Gemfile:

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

Когда я закомментирую эту строку, запустите установку пакета и повторите попытку app.get, все работает нормально. Так что searchlogic каким-то образом мешает Trail.all. Почему Trail.all не работает с установленным searchlogic?


person theraju    schedule 04.11.2012    source источник
comment
Что произойдет, если вы сделаете: trails = Trail.all; render json: trails?   -  person Anthony Alberto    schedule 04.11.2012
comment
Я предполагаю, что вы перезаписали as_json или to_json в одной из этих моделей.   -  person apneadiving    schedule 04.11.2012
comment
Я попробовал trails = Trail.all; render :json => trails и получил ту же ошибку.   -  person theraju    schedule 04.11.2012
comment
Не думаю, потому что модели очень простые. Вот весь их код: 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   -  person theraju    schedule 04.11.2012
comment
Эта ссылка http://kiranb.scripts.mit.edu/blog/?p=247, похоже, указывает на то, что searchlogic не будет хорошо работать с Rails 3.2.8, чем я и занимаюсь. Я ищу альтернативу squeel.   -  person theraju    schedule 04.11.2012


Ответы (1)


Гем rd_searchlogic был источником проблемы. 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

person theraju    schedule 06.11.2012