Ruby on rails RubyonRails中的方法查询-未定义的方法'read';对于

Ruby on rails RubyonRails中的方法查询-未定义的方法'read';对于,ruby-on-rails,plugins,methods,messages,Ruby On Rails,Plugins,Methods,Messages,作为学习ruby/rails的一部分,我尝试从头开始在我的应用程序中实现,而不仅仅是安装插件。(我知道,这会给自己带来麻烦,但这是一次很好的学习经历。) 我创建了模型,关联看起来还可以,我可以很好地创建新邮件,它们会显示在收件人邮箱中。但是,如果我单击查看一条消息(调用消息控制器中的show方法),它会在查找名为“read”的方法时出错,例如 undefined method `read' for #<Class:0xb6f9ef78> 与直接插入到我自己的消息控制器和模型中有关,

作为学习ruby/rails的一部分,我尝试从头开始在我的应用程序中实现,而不仅仅是安装插件。(我知道,这会给自己带来麻烦,但这是一次很好的学习经历。)

我创建了模型,关联看起来还可以,我可以很好地创建新邮件,它们会显示在收件人邮箱中。但是,如果我单击查看一条消息(调用消息控制器中的show方法),它会在查找名为“read”的方法时出错,例如

undefined method `read' for #<Class:0xb6f9ef78>
与直接插入到我自己的消息控制器和模型中有关,类方法和实例方法之间的关系是什么?我以为我插进去了

def read(id, reader)
...
end
进入模型中,但是读取?插件代码的instance methods部分中的方法让我感到困惑,我继续在查看消息时遇到错误


谢谢你的帮助

我没有看过插件,但是根据其他插件的标准,我认为您需要这样的东西:

def self.read(id, reader)
  ...
end
这将使它成为一个类方法,可以通过调用
User.read
来访问


(我假设这是因为
模块ClassMethods
块)

我没有看过插件,但基于其他插件的标准,我认为您需要这样的东西:

def self.read(id, reader)
  ...
end
这将使它成为一个类方法,可以通过调用
User.read
来访问


(我假设这是因为
模块ClassMethods
块)

ClassMethods/InstanceMethods是基于此代码的标准Ruby技术:

def self.included(base)
  base.extend ClassMethods
  base.include InstanceMethods
end 
您将(大致)在原始代码中找到它。顺便说一句,ActiveSupport::Concern可以简化上面的代码(查看文档了解更多信息)

因此,每当模块包含在类中时,ClassMethods模块中的所有方法都将成为目标类的类方法,InstanceMethods中的所有方法都将成为目标类的实例方法

因此,您的
read
方法是class方法,它必须被称为:

m = MyModel.new
m.read?          # => ok, it is an instance method
MyModel.read     # => ok, it is a class method
m.read           # => oops, WRONG! FAILURE! 
                 # You are calling class method through object
元编程规则

如果您重写代码时没有使用meta thing,则应将其编写为:

class MyModel
  def self.read
  end

  def read?
  end

end    

ClassMethods/InstanceMethods是基于以下代码的标准Ruby技术:

def self.included(base)
  base.extend ClassMethods
  base.include InstanceMethods
end 
您将(大致)在原始代码中找到它。顺便说一句,ActiveSupport::Concern可以简化上面的代码(查看文档了解更多信息)

因此,每当模块包含在类中时,ClassMethods模块中的所有方法都将成为目标类的类方法,InstanceMethods中的所有方法都将成为目标类的实例方法

因此,您的
read
方法是class方法,它必须被称为:

m = MyModel.new
m.read?          # => ok, it is an instance method
MyModel.read     # => ok, it is a class method
m.read           # => oops, WRONG! FAILURE! 
                 # You are calling class method through object
元编程规则

如果您重写代码时没有使用meta thing,则应将其编写为:

class MyModel
  def self.read
  end

  def read?
  end

end    

谢谢你非常详尽的回答!谢谢你非常详尽的回答!