Paperclip和json,“堆栈层次太深”

时间:2011-09-27 13:16:16

标签: ruby-on-rails ruby paperclip

我在我的一个模型中使用Paperclip:

class Event < ActiveRecord::Base
  belongs_to :continent
  belongs_to :event_type 

  scope :continent, lambda { |continent|
     self.scoped.where('continent_id IN ( ? )', continent) unless continent.blank?
  }

  scope :event_type, lambda { |eventType|
      self.scoped.where('event_type_id IN ( ? )', eventType) unless eventType.blank?
  }

  scope :in_date, lambda { |date|
      self.scoped.where('(MONTH(`date_start`) BETWEEN ? AND ?) OR (MONTH(`date_end`) BETWEEN ? AND ?)',   date[0],date[1],date[0],date[1]) unless date.blank?
   }

   has_attached_file :map, :styles => { :medium => "238x238>", 
                                   :thumb => "100x100>"
                                 }
 end

我对此操作发出了Ajax请求:

def filter
 @events = Event.scoped
 @events = @events.continent(params[:continents]) unless params[:continents].blank?
 @events = @events.event_type(params[:event_type]) unless params[:event_type].blank?
 @events = @events.in_date(params[:months]) unless params[:months].blank?

 respond_with( @events )
end

我称这个网址为json答案。当我这样做时,我得到错误:“堆栈级别太深”

任何人都可以帮助我?

我的踪迹在这里:

http://paste.bradleygill.com/index.php?paste_id=316663

1 个答案:

答案 0 :(得分:1)

Stack depth too deep表示您最终陷入无限循环。你的大陆范围是问题,因为你的方法和参数具有相同的名称,当你在大陆范围内调用参数时,你最终会得到一个无限循环。

另外,为什么不将范围编写为一系列类方法呢?我并不是使用lambdas传递范围中的参数的狂热粉丝,因为它使得阅读更难。以下是将范围作为类方法的示例

class Event < ActiveRecord::Base
  belongs_to :continent
  belongs_to :event_type 

  class << self
    def continent(cont)
      where('continent_id IN ( ? )', cont) unless cont.blank?
    end

    def event_type(eventType)
      where('event_type_id IN ( ? )', event_type_id) unless event_type_id.blank?
    end

    def in_date(date)
      where('(MONTH(`date_start`) BETWEEN ? AND ?) OR (MONTH(`date_end`) BETWEEN ? AND ?)',   date[0],date[1],date[0],date[1]) unless date.blank?
    end
  end

  has_attached_file :map, :styles => { :medium => "238x238>", 
                               :thumb => "100x100>"
                             }
end