【问题标题】:Rails 4: Set enum field through FactoryGirl attributesRails 4:通过 FactoryGirl 属性设置枚举字段
【发布时间】:2017-04-11 08:17:48
【问题描述】:

我有一个具有枚举作为属性的模型。

class ApplicationLetter < ActiveRecord::Base
  belongs_to :user
  belongs_to :event

  validates :user, :event, presence: true

  enum status: {accepted: 1, rejected: 0, pending: 2}

end

以及生成此模型并为枚举设置值的工厂

FactoryGirl.define do
  factory :application_letter do
    motivation "motivation"
    user
    event
    status :accepted
  end
end

在控制器测试中我想通过工厂获取有效属性

let(:valid_attributes) { FactoryGirl.build(:application_letter).attributes }

并使用这些属性创建一个应用程序。

application = ApplicationLetter.create! valid_attributes

但我收到以下错误:

参数错误: “1”不是有效状态

为什么状态被解释为字符串?如果我在工厂更改状态,我会得到相同的错误,但对应的编号正确。

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-4 enums factory-bot


【解决方案1】:

你可以更动态地做到这一点:

FactoryGirl.define do
  factory :application_letter do
    motivation "motivation"
    user
    event
    status { ApplicationLetter.statuses.values.sample }
  end
end

在此每次你都会得到不同的状态

或者如果想使用静态值你必须使用整数,因为enums 默认使用整数值

【讨论】:

    【解决方案2】:

    您的工厂只需要status 'accepted'

    【讨论】:

      【解决方案3】:
      let(:valid_attributes) { FactoryGirl.build(:application_letter).attributes.merge(status: 'accepted') }
      

      【讨论】:

      • 感谢您的快速回复。不幸的是,它没有帮助。错误仍然完全相同:/
      • 另外,你db的status列中存储的是什么类型的数据?它是一个整数字段,对吗?
      • 是的,它是一个整数。现在它适用于您更新的答案,如果我删除工厂中的条目。它看起来有点hacky,但至少它有效。非常感谢:)
      • 如果解决了你的问题,你能接受吗?
      • 对我来说,这些解决方案看起来有点“hacky”。我对 Rails(和一般的 Ruby)比较陌生,但我认为像其他属性一样直接在工厂中设置状态会很好。我已经赞成您的回答,这确实很有帮助,但也许他们是一个更好的解决方案,对我来说看起来更干净。如果不存在这样的解决方案,我当然会接受您的回答:)
      猜你喜欢
      • 2019-09-13
      • 2015-07-23
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多