Ruby on rails RubyonRails中的方法查询-未定义的方法'read';对于
作为学习ruby/rails的一部分,我尝试从头开始在我的应用程序中实现,而不仅仅是安装插件。(我知道,这会给自己带来麻烦,但这是一次很好的学习经历。) 我创建了模型,关联看起来还可以,我可以很好地创建新邮件,它们会显示在收件人邮箱中。但是,如果我单击查看一条消息(调用消息控制器中的show方法),它会在查找名为“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> 与直接插入到我自己的消息控制器和模型中有关,
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
谢谢你非常详尽的回答!谢谢你非常详尽的回答!