Rails 3 拐点问题
Posted
技术标签:
【中文标题】Rails 3 拐点问题【英文标题】:Rails 3 Inflection Problem 【发布时间】:2011-09-12 02:33:56 【问题描述】:我在为帆船赛生成脚手架时遇到问题。当我跑步时
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
希望这对将来的人有所帮助!
【问题讨论】:
你是怎么修改文件的? 【参考方案1】:我知道这篇文章已经过时了,但我想我也会贡献我的发现。
经过大量开发后,我一直在将 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”行得到解决
config/routes.rb
#devise_for :users
宾果游戏。这不是 Devise 唯一一次让我惊讶于不那么明显的“黑魔法”。当然,一旦生成了我的 rspec 存根,我就取消了对该行的注释。现在可以开始编写我的单元测试了!
【讨论】:
两年多后仍然相关。这也帮助了我,谢谢。【参考方案2】:鉴于错误消息指出Regatta
已在您的应用程序中使用(Rails 显然没有保留它),我猜Regattum
模型仍然存在。
我建议销毁脚手架并重试。听起来,一旦在应用程序中定义了一个词,Rails 就有一个内置的保护机制来防止改变变形。因此,抛出这个错误是为了防止在这种情况下出现意外行为。
【讨论】:
我破坏了脚手架——所以没有模型、控制器或视图——而且变形器仍然没有运气。我也从未做过rake db:migrate
,所以也没有数据库表。我正在把头发拉到这个上面。
你是对的。我打电话给我的申请赛舟会,这显然是把它扔掉了。感谢您为我指明正确的方向!以上是关于Rails 3 拐点问题的主要内容,如果未能解决你的问题,请参考以下文章