find方法引发ArgumentError “错误的参数数目(1 0)”

问题描述:

在导轨控制台..find方法引发ArgumentError “错误的参数数目(1 0)”

Physician.find(1285849521)导致

ArgumentError: wrong number of arguments (1 for 0) 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/connection_adapters/postgresql/database_statements.rb:160:in `initialize' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/connection_adapters/postgresql/database_statements.rb:160:in `new' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/connection_adapters/postgresql/database_statements.rb:160:in `substitute_at' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/relation/query_methods.rb:989:in `block in create_binds' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/relation/query_methods.rb:987:in `each' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/relation/query_methods.rb:987:in `each_with_index' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/relation/query_methods.rb:987:in `create_binds' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/relation/query_methods.rb:962:in `build_where' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/relation/query_methods.rb:586:in `where!' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/relation/query_methods.rb:576:in `where' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/querying.rb:10:in `where' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/core.rb:150:in `block (2 levels) in find' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/statement_cache.rb:80:in `call' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/statement_cache.rb:80:in `create' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta4/lib/active_record/core.rb:149:in `block in find' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/2.1.0/mutex_m.rb:73:in `synchronize' 
... 13 levels... 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activesupport-4.2.0.beta4/lib/active_support/dependencies.rb:246:in `load' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activesupport-4.2.0.beta4/lib/active_support/dependencies.rb:246:in `block in load' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activesupport-4.2.0.beta4/lib/active_support/dependencies.rb:237:in `load_dependency' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/activesupport-4.2.0.beta4/lib/active_support/dependencies.rb:246:in `load' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/spring-1.1.3/lib/spring/commands/rails.rb:6:in `call' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/spring-1.1.3/lib/spring/command_wrapper.rb:38:in `call' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/spring-1.1.3/lib/spring/application.rb:180:in `block in serve' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/spring-1.1.3/lib/spring/application.rb:153:in `fork' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/spring-1.1.3/lib/spring/application.rb:153:in `serve' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/spring-1.1.3/lib/spring/application.rb:128:in `block in run' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/spring-1.1.3/lib/spring/application.rb:122:in `loop' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/spring-1.1.3/lib/spring/application.rb:122:in `run' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/spring-1.1.3/lib/spring/application/boot.rb:18:in `<top (required)>' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require' 
    from /Users/tim/.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require' 

当然..

Physician.find()结果为“ActiveRecord的:: RecordNotFound:找不到没有ID的医师“

My physician.rb is

class Physician < ActiveRecord::Base 
    self.table_name = "t_phys" 
    self.primary_key = "sln" 
end 

我使用的是旧式Postgres数据库,表t_phys有一个名为sln的自然键,它是一个10位整数。在db中有一位医生,其sln为1285849521(上面find方法中的整数),我知道这是因为Physician.all()正常工作,这是显示的第一条记录。

我在做什么错?我怎样才能使查找方法正常工作?我刚刚开始使用rails,可能是某处出现新手错误。感谢帮助!

更多详细信息,当我为localhost:3000 /医生/ 1285849521,页面呈现:

ArgumentError in PhysiciansController#show 

Wrong number of arguments (1 for 0) 

Extracted source (around line #160):     

159  def substitute_at(column, index) 
160   Arel::Nodes::BindParam.new "$#{index + 1}" 
161  end 
162 
163  def exec_query(sql, name = 'SQL', binds = []) 

如果必要的话,我可以提供完整的堆栈跟踪。

+2

可能是ActiveRecord 4.2 beta 4中的一个bug。你是否试过向前看(看起来像是一个Rails 4.2 rc2),或者向后看到像Rails 4.1更稳定的东西? – 2014-12-08 00:23:25

+0

我更新到4.2 rc2,现在有一个不同的,更有希望的“找不到'sln'= 1285849521”的医师“错误。现在正在调试它,谢谢! – 2014-12-08 00:32:31

+1

@ToddAgulnick:你应该让这个答案。 :) – 2014-12-08 01:01:13

似乎它应该工作,但我想知道如果自定义主键仍然与find搞乱。

也许这样的背景将有助于确认的一种方式或其他:

http://ruby-journal.com/how-to-override-default-primary-key-id-in-rails/

+0

是的,我需要更多地阅读这个,谢谢你的链接,现在就通过它。 – 2014-12-08 00:33:51

由于上述托德Agulnick的评论,我更新到Rails 4.2 RC2和错误走了。我遇到了一个新的错误,我解决了这个错误,并且超出了这个问题的范围。谢谢托德!

+1

不客气。我觉得这里有一个潜在的真理,就像“难以捉摸的问题总是藏在你不看的地方”。在这种情况下,由于您刚刚返回Rails,您自然认为问题是您的错误。所以当然这是Rails的问题。很高兴听到你的工作。 – 2014-12-08 05:49:32