未初始化的常量 ArticleFormTest::Reform gem 教程中的文章



我正在学习有关reformgem 的教程,但遇到了错误。

来源:http://culttt.com/2016/02/10/using-form-objects-in-ruby-on-rails-with-reform/

错误:

名称错误: 未初始化的常量 文章表单测试::文章 test/forms/article_form_test.rb:8:in 'setup'

我的理解是,这是由于以下@model = Article.new造成的:

require 'test_helper'
class ArticleFormTest < ActiveSupport::TestCase
def setup
@model = Article.new
@form = ArticleForm.new(@model)
end
test "should require title" do
@form.validate({})
assert_includes(@form.errors[:title], "can't be blank")
end
end

我已经设置了article_form.rb,(见下文)。所以我不确定为什么会发生这种情况。

require "reform/form/validation/unique_validator.rb"
class ArticleForm < Reform::Form
property :title,        presence: true, unique: true
property :markdown,     presence: true
property :published_at, presence: true
property :user,         presence: true
end

谁能告诉我我可能做错了什么?

更新

下面根据请求添加。

test_helper.rb

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
class ActiveSupport::TestCase
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
fixtures :all
# Add more helper methods to be used by all tests here...
end

这是你的线索:ArticleFormTest::Article

由于它找不到Article任何地方定义的类,因此它假定它在当前类中的某个位置具有命名空间 - 但事实并非如此。所以系统抛出一个错误。您需要让您的测试知道在哪里定义文章模型或在测试中定义它(我强烈建议不要这样做 - 将您的定义保存在一个地方,除非您可以证明仅为测试创建单独的定义是合理的。

对您的评论:

"另外,我认为我不需要article.rb文件作为目的 改革是将形式与模式脱钩。我说错了吗?

您仍然需要一个模型来提供给表单以使其进行处理。改革只是一种特殊类型的对象——一个表单对象,它知道如何处理模型,但它仍然需要一个模型。这里的解耦是指您的模型只处理持久性(写入和保存到存储(DB,硬盘驱动器,内存)以及一些查找范围)。改革或表单对象,协调数据如何验证并插入到一个或多个模型中。

模型非常擅长对数据存储进行建模,但并不总是擅长从现实世界的用户/系统获取输入。这就是表单对象/改革宝石的目的。并且还使模型更易于管理。

还有一件事要强调,有一天可能会派上用场:改革——不在乎模式是什么。就改革而言,它只是一个普通的红宝石对象。这意味着 Reform 并不关心模型是否由数据库、文本文件、处理图形文件的临时对象等支持。 特别是如果你使用dry-rb/dry-validations,而不是ActiveModel验证,它甚至不需要知道你正在使用什么ORM。

希望这有帮助。

最新更新