使用act_as_ferret时的NameError

时间:2010-05-15 13:52:51

标签: ruby-on-rails ruby

我在使用

时遇到此错误
acts_as_ferret :fields =>[:competitor], :remote => true
  

PartController中的NameError #index

     

未初始化的常量PartController :: Competitor

我的模特

class Competitor < ActiveRecord::Base
  validates_presence_of :fee_earner_id, :notes
  belongs_to :fee_earner 
  belongs_to :country 
  belongs_to :state 
  belongs_to :user
  acts_as_ferret :fields =>[:competitor], :remote => true
end  

我的控制器

class PartController < ApplicationController
  def index
    @proscribeds = Competitor.paginate(:all, 
                                       :order => sort , 
                                       :page => params[:page], 
                                       :per_page => 70 )
  end 
end

它在 localhost 中运行良好,但是当我在服务器中部署它时,我收到此错误。

act_as_ferret与其他模特配合得很好。我不知道为什么这不仅适用于Competitor模型。

2 个答案:

答案 0 :(得分:0)

这些看似简单的建议,但这就是我想到的:

  • 您是否在localhost和服务器上拥有相同的操作系统?我被一些小的差异所困扰,比如Unix和Windows如何处理混合案例路径名之间的差异。
  • 是否已移动所有文件的最新版本?你能做一个差异并确保没有丢失的配置文件或环境变量吗?

我知道这些建议并不是特定于特定于Rail / Ruby的,但我发现很少有配置问题比实际的代码错误更令我头疼。

祝你好运!

答案 1 :(得分:0)

这可能是您正在运行的远程drb服务器上的bin/ferret_server文件的问题。它抱怨的是它对PartController::Competitor模型一无所知。这是因为ferret-server并没有像Rails那样急于加载所有Rails类。

我有类似的问题,解决方案是还要求Rails config/environment文件以及Rails config/application文件。

这样的事情:

begin
  ENV['FERRET_USE_LOCAL_INDEX'] = 'true'
  if env = $ferret_server_options['environment']
    ENV['RAILS_ENV'] = env
  end

  # determine RAILS_ROOT unless already set
  root = File.expand_path(determine_rails_root)

  begin
    require File.join(root, 'config', 'application')
    # Also require environment to eager load Rails classes
    require File.join(root, 'config', 'environment')
  rescue
    puts "Error booting your rails app at #{root}: #{$!}\n#{$!.backtrace.join("\n")}"
    raise $!
  end

  puts "Rails.root: #{Rails.root}"
  puts "Rails.env: #{Rails.env}"

  require 'acts_as_ferret/server/server'
  ActsAsFerret::Server::Server.new.send($ferret_server_action)
rescue Exception => e
  $stderr.puts(e.message)
  $stderr.puts(e.backtrace.join("\n")) if $ferret_server_options['debug']
  exit(1)
end