参数错误:参数数量错误

时间:2016-01-18 12:06:02

标签: ruby-on-rails

我在rails控制台中写了以下内容。

> class Hello
>   def method
>     d = Jobs.find_by_sql("select id, count(*) as TOTAL from table group by id having count>100")
>     d.each do |m|
>         puts m.account_id
>       end
>     end
>   end

 => :method 
> Hello.method
ArgumentError: wrong number of arguments (0 for 1)

我无法弄清楚此代码中的错误。我该如何解决这个错误。

1 个答案:

答案 0 :(得分:4)

您的方法名称“method”是Object类的现有方法,它最终由ruby中的所有类继承。

使用此名称定义实例方法,这样就可以了,如果已经存在,则会覆盖继承的实例方法。但是,当你来调用它时,你将其称为类方法(因为你在Hello上调用它,这是类),所以你正在调用它现有的“方法”方法,抱怨没有得到任何参数。

您的方法更改为“foo”,然后尝试Hello.foo。您将得到“未定义的方法或变量”错误,因为没有foo类方法。

然后做

hello = Hello.new
hello.foo

它会起作用。

编辑:

如果您希望它实际上类方法,那么您可以通过以下任一方式来实现:

class Hello

  def self.method
    d = Jobs.find_by_sql("select id, count(*) as TOTAL from table group by id having count>100")
    d.each do |m|
        puts m.account_id
      end
    end
  end

end

class Hello

  #class methods go in here 
  class << self

    def method
      d = Jobs.find_by_sql("select id, count(*) as TOTAL from table group by id having count>100")
      d.each do |m|
          puts m.account_id
        end
      end
    end

  end
end

顺便说一下,使用有意义的变量名是一种惯例,通常是一个好主意。例如,如果您有一个作为Job对象集合的变量,则将其称为“jobs”,而不是“d”。然后,任何阅读代码的人都可以轻松记住该变量中的内容。

使用这个原则,我会重写你的代码:

    def output_job_account_ids
      jobs = Jobs.find_by_sql("select id, count(*) as TOTAL from table group by id having count>100")
      jobs.each do |job|
          puts job.account_id
        end
      end
    end

看看现在发生的事情会更加明显吗?我也重命名了方法名称:通常一个方法名称描述方法的作用通常是个好主意。