4

我在为 Regatta 生成脚手架时遇到问题。当我跑

rails g scaffold Regatta name:string start_date:datetime

我得到一个名为 regattum 的模型和一个名为 regatta_controller 的控制器(而不是 regattas_controller)

  invoke  active_record
  create    db/migrate/20110609221608_create_regatta.rb
  create    app/models/regattum.rb
  invoke    test_unit
  create      test/unit/regattum_test.rb
  create      test/fixtures/regatta.yml
   route  resources :regatta
  invoke  scaffold_controller
  create    app/controllers/regatta_controller.rb
  invoke    erb
  create      app/views/regatta
  create      app/views/regatta/index.html.erb
  create      app/views/regatta/edit.html.erb
  create      app/views/regatta/show.html.erb
  create      app/views/regatta/new.html.erb
  create      app/views/regatta/_form.html.erb
  invoke    test_unit
  create      test/functional/regatta_controller_test.rb
  invoke    helper
  create      app/helpers/regatta_helper.rb
  invoke      test_unit
  create        test/unit/helpers/regatta_helper_test.rb
  invoke  stylesheets

相同的 public/stylesheets/scaffold.css

显然这是一个拐点问题,但是每当我修改 /config/initializers/inflections.rb 时,我都会收到一条错误消息:

The name 'Regatta' is either already used in your application or reserved by Ruby on Rails. Please choose an alternative and run this generator again.

我已经尝试了所有我能想到的让它工作,但我一直收到错误。任何有关解决方案或解决方法的建议将不胜感激!


更新

以下是我尝试过的一些事情:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'regatta', 'regattas'
end

这并没有改变任何东西,所以我尝试了以下一些选项,其中包括不同的组合,但无济于事:

 inflect.plural 'regatta', 'regattas'
  inflect.singular 'regattas', 'regatta'
  inflect.singular 'regatta', 'regatta'

更新 2

这是我在发现自己做错了什么后在 inflections.rb 中使用的代码:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.plural 'regatta', 'regattas'
  inflect.singular 'regatta', 'regatta'
  inflect.singular 'regattas', 'regatta'
end

希望这将有助于将来的人!

4

2 回答 2

9

我承认这篇文章很旧,但我想我也会贡献我的发现。

经过大量开发后,我一直在将 rpsec 和 cucumber 集成到我的应用程序中(是的;顽皮,顽皮)。我想为我的模型生成 rspec 存根并测试我的应用程序单元。我通常能够将关联的迁移移出 db/migrate/ 并运行“bundle exec rails g”来重新生成脚手架,在这种情况下,就是 rspec 存根。这次不行。

<终端>

bundle exec rails g scaffold User email:string ... 
      updated_at:datetime roles_mask:integer --trace

      invoke  active_record

The name 'User' is either already used in your application 
      or reserved by Ruby on Rails. Please choose an alternative 
      and run this generator again.

通过暂时注释掉我的“config/routes.rb”文件中的“devise_for”行解决了我的问题

配置/路由.rb

#devise_for :users

答对了。而这并不是 Devise 唯一一次让我惊讶于不那么明显的“黑魔法”。当然,一旦生成了我的 rspec 存根,我就取消了该行的注释。现在开始编写我的单元测试了!

于 2012-06-06T21:36:03.107 回答
1

鉴于错误消息Regatta已在您的应用程序中使用(Rails 显然没有保留它),我猜该Regattum模型仍然存在。

我建议破坏脚手架并重试。听起来,一旦应用程序中已经定义了一个词,Rails 就有一个内置的保护机制来防止改变变形。因此,抛出这个错误是为了防止在这种情况下出现意外行为。

于 2011-06-09T23:01:34.110 回答