如何使ActiveModel::API引用工作



我有一个现有的简单rails应用程序,我正在尝试修改它。我正在努力让一个ActiveModel模型在这个应用程序中工作(现有的模型都使用dynaid(。我构建了这个类,并使它能够成功地填充show视图。然而,当我尝试切换到edit视图时,一切都会崩溃。我认为解决这个问题的方法是在类中添加include ActiveModel::API。至少这是医生们的建议。

然而,当我这样做的时候,我会得到

名称错误(未初始化的常量ActiveModel::API(

我找到了正确的gem并安装了gem install activemodel,然后重试,但即使使用了正确的宝石,也会发生同样的错误。我试过重新启动rails应用程序,但没有成功。我曾尝试在文件顶部添加require 'active_model'(正如一些可能不相关的github问题中所建议的那样(,但没有成功。我浏览了gemfile.lock,发现它已经需要一个旧版本的activemodel,所以我卸载了新版本并安装了旧版本,重新启动了rails,但没有成功。搜索错误消息会带来麻烦——通常是处理应用程序中的类引用问题,而不是引用gem。

如果重要的话,这里是我的版本:

  • ruby:2.7.4
  • 活动模型:6.1.3.1
  • 轨道:6.1.3.1

这是我的课堂开始时的样子:

# app/models/complex_model.rb
require 'active_model'
class ComplexModel
include ActiveModel::API

我的问题是:我如何才能克服这个未初始化的常量问题?

您使用的文档用于错误版本的Rails。

ActiveModel::API是在Rails7中引入的。坦率地说,如果你去掉评论,并没有发生太多事情:

module ActiveModel
module API
extend ActiveSupport::Concern
include ActiveModel::AttributeAssignment
include ActiveModel::Validations
include ActiveModel::Conversion
included do
extend ActiveModel::Naming
extend ActiveModel::Translation
end
def initialize(attributes = {})
assign_attributes(attributes) if attributes
super()
end
# Indicates if the model is persisted. Default is +false+.
#
#  class Person
#    include ActiveModel::API
#    attr_accessor :id, :name
#  end
#
#  person = Person.new(id: 1, name: 'bob')
#  person.persisted? # => false
def persisted?
false
end
end
end

他们所做的基本上是将ActiveModel::Model模块中的部分重新排列到另一层中。ActiveModel::Model由从Rails5中的ActiveRecord中抽象出来的部分组成,可用于非数据库支持的模型,并作为构建对象关系管理器甚至API客户端数据包装器等内容的基础块。

其想法是,ActiveModel::API将只包含与多态路由和I18n模块等交互所需的基本必要性,而ActiveModel::Model将在某个时候包括ActiveModel::Attributes,这与提供自己的属性实现(如ActiveRecord(的ORM不兼容。

无论你在Rails6中做什么,你都可以简单地解决它,包括ActiveModel::ModelActiveModel::Attributes

最新更新