【问题标题】:Method not found in instantiated class (Ruby/Rails)在实例化类中找不到方法(Ruby/Rails)
【发布时间】:2011-07-13 10:27:27
【问题描述】:

所以我来自 Java 背景,您可以在其中创建这样的类。

TestClass x = new TextClass();

并调用它的方法 x.shout();

我正在尝试在没有这种外观的情况下在 ruby​​ 中做类似的事情。这可能是语法问题,也可能是我不太了解 ruby​​ 和 rails 的概念。

所以这是 Ruby 中服务器上的一个类

class myResource< ActiveResource::Base
  self.site = "http://localhost:3008"
  def self.shout
    puts "I AM AN ACTIVE RESOURCE SHOUT!"
    puts " CAPS RAGE YEAH!"
    puts Time.now
  end
end

这位于客户端。

这是与服务器上的活动记录相同的类:

class myRecord < ActiveRecord::Base
  def self.shout
  puts "I AM AN ACTIVE RECORD SHOUT!"
  puts " CAPS RAGE YEAH!"
  puts Time.now
  end

end

这就是我尝试的结果。

在 Rails 控制台中的服务器上:

?> myRecord.shout
I AM AN ACTIVE RECORD SHOUT!
 CAPS RAGE YEAH!
Wed Jul 13 10:17:33 +0100 2011
=> nil
>> 

然而,在客户端,

myResource.shout
NoMethodError: undefined method `shout' for myResource:Class
    from (irb):206
>>

在我看来这是没有意义的,因为它们几乎相同,应该这样称呼。

如果我将它们中的任何一个实例化为

@test = myResource or myRecord.new(blah blah blah)

当我写@test.shout

我得到相同的未定义方法。

我对 Ruby 中的对象的概念被打破了。有人对我在这里做错了什么有任何建议吗?

【问题讨论】:

  • 您的代码根本不应该工作。类名必须以大写字母开头。
  • @dogbert。你好。我喜欢你的漫画。他们原来的课程确实以大写字母开头。我正在匆匆写下这个问题并没有发现。道歉

标签: ruby-on-rails ruby oop activerecord activeresource


【解决方案1】:

Ruby 类总是大写的。此外,当您在类中声明常规方法时,您不会引用 self 。

这就是你想要的:

class MyRecord 

    def shout
        puts "I AM AN ACTIVE RECORD SHOUT!"
        puts "CAPS RAGE YEAH!"
        puts Time.now
    end

end

然后随心所欲地运行它:

> MyRecord.new.shout
=> "I AM AN ACTIVE RECORD SHOUT!"
=> "CAPS RAGE YEAH!"
=> 2011-07-13 06:35:18 -0400

【讨论】:

  • NP:) def method.self 用于模块中的单例方法。当你有 mixin 时,这会更有意义。
  • 我的印象是 self 方法是类方法(而不是实例方法)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多