Ruby 工厂机器人可以';“创造”一词;项目“;工厂

Ruby 工厂机器人可以';“创造”一词;项目“;工厂,ruby,factory-bot,Ruby,Factory Bot,我在一个项目中写了几个工厂。除了项目工厂之外,所有这些都可以工作 在rails控制台中运行工厂时,出现以下错误 FactoryBot.create(:project) NoMethodError: undefined method `name' for :project:Symbol from /home/user/.rvm/gems/ruby-2.3.6/gems/factory_bot-4.11.1/lib/factory_bot/declaration/implicit.rb:11:in

我在一个项目中写了几个工厂。除了
项目
工厂之外,所有这些都可以工作

在rails控制台中运行工厂时,出现以下错误

FactoryBot.create(:project)
NoMethodError: undefined method `name' for :project:Symbol from /home/user/.rvm/gems/ruby-2.3.6/gems/factory_bot-4.11.1/lib/factory_bot/declaration/implicit.rb:11:in `=='
似乎不知何故,factory_bot无法将符号:project转换为它的project类

Ruby版本是2.3.6。工厂机器人是4.11.1。工厂机器人轨道也是4.11.1

这是我的项目工厂文件:

require 'faker'

FactoryBot.define do
  factory :project do
    name                              { Faker::Company.name }
    product_type                      { Faker::Number.between(0, 1) }
    sale_type                         { Faker::Number.between(0, 1) }
    description                       { Faker::Lorem.sentence }
    street                            { Faker::Address.street_name }
    neighborhood                      { Faker::Address.community }
    zip_code                          { Faker::Address.zip }
    country                           { Faker::Address.country_code }
    state                             { Faker::Address.state_abbr }
    city                              { Faker::Address.city }
    town                              { Faker::Address.city }
    logo                              { Faker::Company.logo }
    cover                             { Faker::Company.logo }
    send_from_email                   { Faker::Internet.email }
    parking_lot_cost                  { Faker::Number.decimal(2) }
    warehouse_m2_cost                 { Faker::Number.decimal(2) }
    association :client, factory: user
    inventory_dimension_value         { Faker::Number.digit }
    total_m2                          { Faker::Number.decimal(2) }
    sales_volume_total                { Faker::Number.decimal(2) }
    total_units                       { Faker::Number.digit }
    current_m2_sold                   { Faker::Number.decimal(2) }
    sales_volume_current_sold         { Faker::Number.decimal(2) }
    current_units_sold                { Faker::Number.digit }
    sales_volume_to_sell              { Faker::Number.decimal(2) }
    next_list_acum                    { Faker::Number.decimal(2) }
    from_email                        { Faker::Internet.email }
    saved_next_list_acum              { Faker::Number.decimal(2) }
    settings_show_distributions_cols  { Faker::Boolean.boolean }
    settings_price_list_v2_enabled    { Faker::Boolean.boolean }
    api_token                         { Faker::Lorem.word }
  end
end
编辑:这是projects表的数据库架构

                                                   Table "public.projects"                                                    
              Column              |            Type             | Collation | Nullable |               Default                
----------------------------------+-----------------------------+-----------+----------+--------------------------------------
 id                               | integer                     |           | not null | nextval('projects_id_seq'::regclass) 
 name                             | character varying           |           |          |                                      
 product_type                     | integer                     |           |          |                                      
 sale_type                        | integer                     |           |          |                                      
 description                      | text                        |           |          |                                      
 street                           | character varying           |           |          |                                      
 neighborhood                     | character varying           |           |          |                                      
 zip_code                         | character varying           |           |          |                                      
 country                          | character varying           |           |          |                                      
 state                            | character varying           |           |          |                                      
 city                             | character varying           |           |          |                                      
 town                             | character varying           |           |          |                                      
 logo                             | character varying           |           |          |                                      
 cover                            | character varying           |           |          |                                      
 send_from_email                  | text                        |           |          |                                      
 parking_lot_cost                 | double precision            |           |          | 0.0                                  
 warehouse_m2_cost                | double precision            |           |          | 0.0                                  
 created_at                       | timestamp without time zone |           | not null |                                      
 updated_at                       | timestamp without time zone |           | not null |                                      
 client_id                        | integer                     |           |          |                                      
 inventory_dimension_value        | integer                     |           |          |                                      
 total_m2                         | double precision            |           |          | 0.0                                  
 sales_volume_total               | double precision            |           |          | 0.0                                  
 total_units                      | integer                     |           |          | 0                                    
 current_m2_sold                  | double precision            |           |          | 0.0                                  
 sales_volume_current_sold        | double precision            |           |          | 0.0                                  
 current_units_sold               | integer                     |           |          | 0                                    
 sales_volume_to_sell             | double precision            |           |          | 0.0                                  
 next_list_acum                   | double precision            |           |          | 0.0                                  
 from_email                       | character varying           |           |          |                                      
 saved_next_list_acum             | double precision            |           |          |                                      
 settings_show_distributions_cols | boolean                     |           |          | true                                 
 settings_price_list_v2_enabled   | boolean                     |           |          | false                                
 api_token                        | character varying           |           |          |                                      

尝试在工厂描述中声明类名

  FactoryBot.define do
    factory :project, class: 'Project' do
    ...

我在我的一个现有项目中使用相同的代码创建了一个工厂,但得到了完全相同的错误。然后,我将工厂名称更改为
:projector
,再次出现同样的错误。因此,这不是一个受保护的名称问题

我最好的猜测是:

1) 添加项目后是否确保迁移测试数据库

2) 你确定你的应用程序正在连接到你列出的同一个数据库吗

我觉得这可能是因为,如果我向工厂添加了一个属性,但该属性不在其对应的表中,则错误如下:

NoMethodError: undefined method `name=' for #<Report:0x00007fc5bb065c10>
NoMethodError:for的未定义方法'name='#

因此,工厂无法对给定的符号进行常量化,这很可能意味着它没有将其识别为常量/类。

看起来您指的是
关联:客户端,工厂:用户
,而不是
关联:客户端,工厂::用户
:user
应该是一个符号)


这是一条毫无帮助的错误消息。我们在中对错误消息做了一些改进,我们还有一个有待进一步改进的问题:。

您在tour项目模型中是否有name属性?模型中没有,name来自数据库您可以发布tour dB方案吗?这正是问题所在。改进错误消息非常好,我相信很多人都会从中受益。谢谢。该死,在我对开发数据库做了更改之后,我忘记了回滚/迁移测试数据库。谢谢,这个答案让我想起了它。