在从rails 2.0升级到rails 2.3.3后,为什么我得到'错误的参数数量(2 for 1)'?

时间:2009-12-02 22:09:46

标签: ruby-on-rails

这是在我的一个模型PlayerAction中的after_save方法中发生的。我没有在升级期间更改任何代码(着名的最后一句话)。它似乎发生在以下一行:

if self.action_type.id == 1

PlayerAction模型有一个

belongs_to :action_type

将action_type.id更改为action_type_id修复了该问题,但同样的问题发生在另一个地方,在这一行中

player_action.action_type.desc

这是完整的堆栈跟踪,该行中出现问题

C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `find'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `send'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `find_target'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/association_proxy.rb:240:in `load_target'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/association_proxy.rb:112:in `reload'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations.rb:1219:in `action_type'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:164:in `full_xml'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:160:in `each'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:160:in `full_xml'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:156:in `full_xml'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:136:in `full_xml'
C:/InstantRails2-0/rails_apps/rftg/app/models/game.rb:86:in `full_xml'
C:/InstantRails2-0/rails_apps/rftg/app/controllers/games_controller.rb:33:in `show'
C:/InstantRails2-0/rails_apps/rftg/app/controllers/games_controller.rb:30:in `show'

ActionType是我的另一个模型,并且是一个非常通用的名称,正如另一个答案所指出的那样。这可能是问题的根源吗?我查看了主rails框架文档,但没有看到名为ActionType或action_type的类或方法。

原来我只为ActionType添加了一个自定义查找方法:

def self.find(id)
  Rails.cache.fetch(cache_key) { ActionType.find(id) }
end 

ActionType基本上是静态数据,我正在尝试缓存它。 ActionType大约有10行,我还有其他几个具有类似静态数据的模型。这就是我开始升级rails以获得缓存功能的全部原因。我一直试图找到一个如何正确执行此操作的示例。显然上面的代码不正确。我在这里找到了另一个关于在模型中处理静态数据的最佳实践方法的问题,但它没有太大帮助。

1 个答案:

答案 0 :(得分:2)

尝试

if self.action_type_id == 1

至少你会知道这是不是问题。

好的,看到这是一个问题,根据评论,它正在死的Rails中的行就在这里:

def find_target
      find_method = if @reflection.options[:primary_key]
                      "find_by_#{@reflection.options[:primary_key]}"
                    else
                      "find"
                    end
      @reflection.klass.send(find_method,
        @owner[@reflection.primary_key_name],
        :select => @reflection.options[:select],
        :conditions => conditions,
        :include => @reflection.options[:include],
        :readonly => @reflection.options[:readonly]
      ) if @owner[@reflection.primary_key_name]
    end

我假设您使用“id”作为主键,因为它在find方法中死亡,它被反射调用。当然,该方法需要(* args),所以不应该死于2 for 1问题...

那么,a)你为这个类定义了一些自定义查找程序(finder_sql?)

b)这是什么full_xml方法?这只是你打电话的部分

 player_action.action_type.desc