1

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

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

错误:

NameError:未初始化的常量 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
4

1 回答 1

2

这是你的线索:ArticleFormTest::Article

由于它无法在Article任何地方找到定义的类,它假定它在您当前类的某个地方被命名 - 它不是。所以系统抛出错误。您需要让您的测试知道 Article 模型在哪里定义或在测试中定义它(我强烈建议不要这样做 - 将您的定义放在一个地方,除非您可以证明为测试创建单独的定义是合理的。)

对您的评论:

“另外,我认为我不需要 article.rb 文件,因为改革的目的是将表单与模型解耦..我错了吗?”

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

模型非常擅长建模数据存储,但并不总是擅长从现实世界的用户/系统中获取输入。这就是 Form Objects / Reform gem 的目的。并且还使模型更易于管理。

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

希望这可以帮助。

于 2016-06-28T16:17:29.480 回答