2012-11-04 32 views
5

Ứng dụng đường ray của tôi có 3 kiểu. Đường mòn, khu vực và tính năng. Tôi có thể tương tác với các mô hình này trong thư mục lib/tasks của tôi. Tôi đã sử dụng hải quỳ để thu thập dữ liệu và điền vào cơ sở dữ liệu. Ví dụ về các cuộc gọi tôi đã thực hiện trên các kiểu máy:Đường ray: Lỗi quá mức ngăn xếp

Trail.find_or_initialize_by_title(detail_title) 

Tôi hiện đang cố viết một bộ điều khiển sử dụng mô hình.

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

Bây giờ nếu tôi mở đường ray giao diện điều khiển và thử app.get('trail/index') tôi nhận được một mã số 500 trở lại và tôi thấy những điều sau đây trong tôi development.log

SystemStackError (stack mức quá sâu):
app/controllers/trail_controller.rb: 23: trong `index '

Vì vậy, tôi rõ ràng là gây ra một số đệ quy vô hạn. Dòng 23 tương ứng với phần thân của phương thức chỉ mục. Tôi đã thử các mô hình khác trong ứng dụng của tôi: Tính năng và khu vực và kết quả là như nhau. Ai đó có thể cho tôi biết những gì tôi đang làm sai ở đây, hoặc làm thế nào tôi có thể nhận được truy tìm nhiều hơn để tìm ra những gì chính xác là đệ quy vô hạn?

Mô hình của tôi rất đơn giản:

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 

Nó xuất hiện này là bằng cách nào đó được gây ra bởi các đá quý searchlogic. Tôi có điều này trong Gemfile của tôi:

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

Khi tôi nhận xét ra dòng đó, chạy bó cài đặt và thử lại app.get mọi thứ hoạt động tốt. Vì vậy, tìm kiếm bằng cách nào đó đang can thiệp vào Trail.all. Tại sao Trail.all không hoạt động với cài đặt tìm kiếm?

+0

Điều gì xảy ra nếu bạn làm: 'trails = Trail.all; render json: trails'? –

+0

Tôi đoán bạn ghi đè lên as_json hoặc to_json trong một trong các mô hình này. – apneadiving

+0

Tôi đã thử 'trails = Trail.all; render: json => trails' và gặp lỗi tương tự. – theraju

Trả lời

1

Đá quý rd_searchlogic là nguồn gốc của vấn đề. http://kiranb.scripts.mit.edu/blog/?p=247 nói về vấn đề này. "Bất kỳ phạm vi được đặt tên nào Searchlogic tạo ra đều năng động và được tạo thông qua method_missing. Và vì Rails 3.1 thay đổi xung quanh activerecord rất nhiều, Searchlogic gọi phương thức thiếu trên activerecord, sau đó được định tuyến lại tới searchlogic."

Tôi quyết định chuyển sang meta_where, chỉ để biết rằng nó không được hỗ trợ từ Rails 3.1 trở đi. Tôi đang chạy Rails 3.2.8. Squeel là sự thay thế và hoạt động tốt trên Rails 3.2.8: https://github.com/ernie/squeel

Các vấn đề liên quan