Reform gem 教程中未初始化的常量 ArticleFormTest::Article
Uninitialized constant ArticleFormTest::Article in Reform gem tutorial
我正在学习有关 reform
gem 的教程,但是 运行 出错了。
来源:
http://culttt.com/2016/02/10/using-form-objects-in-ruby-on-rails-with-reform/
错误:
NameError: uninitialized constant ArticleFormTest::Article
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
class,它假定它在您当前的 class 中的某个地方命名空间 - 但事实并非如此。所以系统抛出错误。您需要让您的测试知道 Article 模型在哪里定义或在测试中定义它(我强烈建议不要这样做 - 将您的定义放在一个地方,除非您可以证明为测试创建一个单独的定义是合理的。)
您的评论:
"Also, I didn't think I needed article.rb file as the purpose of
reform is to decouple forms from models.. am I incorrect?"
您仍然需要一个模型来提供表单以供其处理。 Reform 只是一种特殊类型的对象 - 一种表单对象,它知道用模型做什么,但它仍然需要一个模型。这里的解耦指的是你的模型只处理持久性(写入和保存到存储(数据库、硬盘、内存)和可能的一些查找范围)。改革或形成对象,协调如何验证数据并将其插入到一个或多个模型中。
模型非常擅长建模数据存储,但并不总是擅长从现实世界中获取输入users/systems。这就是 Form Objects / Reform gem 的目的。并且还使模型更易于管理。
还有一件事要强调,有一天可能会派上用场:改革 - 不在乎是什么模式。就 Reform 而言,它只是一个普通的 ruby 对象。这意味着 Reform 不关心模型是否由数据库、文本文件、处理图形文件的临时对象等支持。特别是如果您使用 dry-rb/dry-validations,而不是 ActiveModel 验证,它甚至不需要知道您使用的是什么 ORM。
希望这对您有所帮助。
我正在学习有关 reform
gem 的教程,但是 运行 出错了。
来源: http://culttt.com/2016/02/10/using-form-objects-in-ruby-on-rails-with-reform/
错误:
NameError: uninitialized constant ArticleFormTest::Article 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
class,它假定它在您当前的 class 中的某个地方命名空间 - 但事实并非如此。所以系统抛出错误。您需要让您的测试知道 Article 模型在哪里定义或在测试中定义它(我强烈建议不要这样做 - 将您的定义放在一个地方,除非您可以证明为测试创建一个单独的定义是合理的。)
您的评论:
"Also, I didn't think I needed article.rb file as the purpose of reform is to decouple forms from models.. am I incorrect?"
您仍然需要一个模型来提供表单以供其处理。 Reform 只是一种特殊类型的对象 - 一种表单对象,它知道用模型做什么,但它仍然需要一个模型。这里的解耦指的是你的模型只处理持久性(写入和保存到存储(数据库、硬盘、内存)和可能的一些查找范围)。改革或形成对象,协调如何验证数据并将其插入到一个或多个模型中。
模型非常擅长建模数据存储,但并不总是擅长从现实世界中获取输入users/systems。这就是 Form Objects / Reform gem 的目的。并且还使模型更易于管理。
还有一件事要强调,有一天可能会派上用场:改革 - 不在乎是什么模式。就 Reform 而言,它只是一个普通的 ruby 对象。这意味着 Reform 不关心模型是否由数据库、文本文件、处理图形文件的临时对象等支持。特别是如果您使用 dry-rb/dry-validations,而不是 ActiveModel 验证,它甚至不需要知道您使用的是什么 ORM。
希望这对您有所帮助。