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?) 的内部运行机制分析

如何从 Rails 通知访问 current_user?

装饰一个Rails引擎助手,以包含来自主应用程序的问题