ActiveSupport::Concern中的InstanceMethods模块..弃用警告

18
我有一个使用Sinatra构建的作品集网站,已经有一段时间没做过了,最近一直在做Rails。昨天我通过运行'gem update'来更新我的 gem 列表,不知道是否与此有关,但今天我又开始在作品集网站上工作,并且收到了一些弃用警告。
“DEPRECATION WARNING: ActiveSupport::Concern 内部的 InstanceMethods 模块将不再自动包含。请直接在 Work 中定义实例方法。(由 /Users/joris/Desktop/sinatra/portfolio/models/work.rb 的 include 调用)”
我不确定如何解决这个问题,当我运行应用程序时它不再工作..访问我的路由只返回了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'

模型的 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中遇到了这个问题。

废弃警告:ActiveSupport::Concern内的InstanceMethods模块将不再自动包含。 请直接在Post中定义实例方法。(在/Users/joris/Desktop/sinatra/portfolio/models/post.rb的include处被调用)

2个回答

41

你的应用程序(或其依赖项)的某个地方正在执行

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 mapper 使用它,并且乍一看,它在许多地方使用了已弃用的 InstanceMethods 惯用语。


我在任何地方都没有做那件事。然而,代码出错的地方(我的模型)包括MongoMapper::Document。这可能是MongoMapper中的“错误”吗?谢谢回复 :) - Joris Ooms
Mongo Mapper 似乎正在使用已经被弃用的形式。 - Frederick Cheung
我删除了所有与mongo_mapper相关的引用,现在我的页面可以加载。 我想我必须等待更新或寻找替代方案。 谢谢 :) - Joris Ooms
如果我是你,我会尝试将Active Support版本固定在3.1.3。 - Frederick Cheung
1
这对我来说破坏了所有相关的测试。真遗憾。我不能将代码移动到类本身,因为这就是我在模块中定义它的原因。所以现在我必须手动将InstanceMethods重命名为MyInstanceMethods,并执行“def self.included(base) base.send :include, MyInstanceMethods end”?真的吗?有更好的解决方案吗? - Dalibor Filus

3

附加说明:如果您更新mongo_mapper gem,就不会再看到这个问题了。 - GroovyCakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接