ActiveSupport::Concern 中的 InstanceMethods 模块.. 弃用警告
Posted
技术标签:
【中文标题】ActiveSupport::Concern 中的 InstanceMethods 模块.. 弃用警告【英文标题】:The InstanceMethods module inside ActiveSupport::Concern.. Deprecation Warning 【发布时间】:2012-01-30 19:07:21 【问题描述】:我有一个在 Sinatra 中构建的投资组合网站。我已经有一段时间没有工作了,一直在做一些 Rails。我昨天通过运行“gem update”更新了我的 gem 列表。我不知道这是否与此有关,但我今天再次开始在投资组合网站上工作,并且收到了一些弃用警告。
弃用警告:内部的 InstanceMethods 模块 ActiveSupport::Concern 将不再自动包含在内。 请直接在 Work 中定义实例方法。 (从 包括在 /Users/joris/Desktop/sinatra/portfolio/models/work.rb:2)
我不知道如何解决这个问题,当我运行应用程序时它不再工作了。去我的路线只会返回 Sinatra 404 页面。 (另外,ActiveSupport 不是 Rails 的一部分吗?为什么这会出现在我的 Sinatra 应用程序中……)
它在错误中提到的文件是 work.rb:
class Work
include MongoMapper::Document
key :title, String
key :url, String
key :filename, String
key :file, String
key :description, String
timestamps!
end
这是我的主文件(portfolio.rb):
require "sinatra"
require 'twitter'
require 'RedCloth'
require 'html_truncator'
require 'digest/md5'
class Portfolio < Sinatra::Application
require_relative 'config/init'
require_relative 'helpers/init'
require_relative 'models/init'
require_relative 'routes/init'
模型初始化文件(调用 work.rb 文件)具有以下内容:
require 'mongo_mapper'
MongoMapper.connection = Mongo::Connection.new('lalaland.com', 10070)
MongoMapper.database = 'hello'
MongoMapper.database.authenticate('lalala', 'hello')
require_relative 'post'
require_relative 'work'
编辑:刚刚看到我也收到了 models/post.rb
弃用警告:内部的 InstanceMethods 模块 ActiveSupport::Concern 将不再自动包含在内。 请直接在 Post 中定义实例方法。 (从 包括在 /Users/joris/Desktop/sinatra/portfolio/models/post.rb:2)
【问题讨论】:
【参考方案1】:这似乎是本月早些时候在 mongo_mapper gem 中修复的,所以我希望这个修复会在下一个版本中出现:
https://github.com/jnunemaker/mongomapper/commit/d2333d944ce6ae59ecab3c45e25bbed261f8180e
【讨论】:
附录:确实如此......如果你更新你的 mongo_mapper gem,你就不会再看到这个了。【参考方案2】:您正在执行的应用程序(或其依赖项)中的某个位置
module Blah
extend ActiveSupport::Concern
module InstanceMethods
def foo
end
end
...
end
Active Support 告诉您这样做
module Blah
extend ActiveSupport::Concern
def foo
end
end
你说得对,Active Support 是 Rails 的一部分,但就像 Active Record 一样,它也可以在没有其他 Rails 的情况下使用。例如,Mongo 映射器使用它,粗略一看,它在一堆地方使用了已弃用的 InstanceMethods
成语
【讨论】:
我不会在任何地方这样做。然而,它在(我的模型)上出错的代码包括 MongoMapper::Document。它可能是 MongoMapper 中的一个“错误”吗?感谢您的回复:) Mongo 映射器似乎确实在使用新弃用的表单。 我删除了对 mongo_mapper 的所有引用,现在我的页面加载了。我想我将不得不等待更新或寻找替代方案。谢谢:) 如果我是你,我会尝试将活动支持版本固定到 3.1.3 这对我来说打破了所有相关的测试。耻辱。我无法将代码移动到类本身,因为这就是我在模块中定义它的原因。所以现在我必须将 InstanceMethods 重命名为 MyInstanceMethods 并手动执行def self.included(base) base.send :include, MyInstanceMethods end
?真的吗?有没有更好的解决方案?以上是关于ActiveSupport::Concern 中的 InstanceMethods 模块.. 弃用警告的主要内容,如果未能解决你的问题,请参考以下文章
在模块前面加上 ActiveSupport::Concern ?红宝石 2+
无法使用 cache_classes = true 为关注 (ActiveSupport::Concern::MultipleIncludedBlocks) 定义多个“包含”块
使用 Ruby on Rails ActiveSupport::Concern 功能时如何“嵌套”包含模块?
ActiveSupport::Concern 和 gem 'name_of_person'(300?) 的内部运行机制分析