gpt4 book ai didi

ruby-on-rails - 没有 class_name 的 FactoryBot 命名空间模型

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:24 25 4
gpt4 key购买 nike

我有这样命名空间的模型:

class Vehicle < ActiveRecord::Base; end

class Vehicle::Car < Vehicle; end
class Vehicle::Train < Vehicle; end
class Vehicle::Jet < Vehicle; end

在为这些模型创建工厂时,它们是按以下方式设置的:

factory :vehicle_car, class: Vehicle::Car do; end
factory :vehicle_train, class: Vehicle::Train do; end
factory :vehicle_jet, class: Vehicle::Jet do; end

这会产生以下弃用警告:

DEPRECATION WARNING: Looking up factories by class is deprecated and will be removed in 5.0. Use symbols instead and set FactoryBot.allow_class_lookup = false.

是否有一种格式可以编写一个符号来命名这些工厂,这样我就不需要使用类名来遵守弃用警告?

最佳答案

关于 :class 选项的行为方式或它期望的值,文档并不是很有用,但源代码更有用。从报错信息回溯我们发现FactoryBot::Decorator::ClassKeyHash#symbolize_keys :

def symbolized_key(key)
if key.respond_to?(:to_sym)
key.to_sym
elsif FactoryBot.allow_class_lookup
ActiveSupport::Deprecation.warn "Looking up factories by class is deprecated and will be removed in 5.0. Use symbols instead and set FactoryBot.allow_class_lookup = false", caller
key.to_s.underscore.to_sym
end
end

第一个分支中的 key.to_sym 是“我想要一个 SymbolString”的惯用法。第二个分支中的 key.to_s.underscore.to_sym 告诉我们期望的格式。

如果你通过 to_s.underscore 运行 Vehicle::Car,你会得到 'vehicle/car' 所以这些应该可以工作:

factory :vehicle_car,   class: 'vehicle/car'   do; end
factory :vehicle_train, class: 'vehicle/train' do; end
factory :vehicle_jet, class: 'vehicle/jet' do; end

或者如果你真的想要Symbol(或者有标点符号):

factory :vehicle_car,   class: :'vehicle/car'   do; end
factory :vehicle_train, class: :'vehicle/train' do; end
factory :vehicle_jet, class: :'vehicle/jet' do; end

关于ruby-on-rails - 没有 class_name 的 FactoryBot 命名空间模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50437961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com