我正在尝试使用以下命令在rails中创建一个新模型:
rails generate model Education name:string
运行时会返回以下错误:
“教育”这个名称已经在你的申请中使用过了 由Ruby on Rails保留。请选择一个替代方案并运行它 发电机再次。
由于我刚刚创建了一个新的app并且只有一个其他模型,因此该应用程序中没有使用该名称,而且我很难想出为什么Rails会保留这样的名称的原因?
有关此错误来自何处以及如何解决此问题的任何想法?
(我已经尝试将名称更改为其他内容并且按预期工作。由于名称确实符合其目的,我不想更改其名称,除非没有别的办法!)
我正在使用Ruby 2.0.0和Rails 4.0.0以及PostgreSQL
答案 0 :(得分:27)
您可能无法创建与Application同名的模型,因为它会创建冲突的名称。当您创建一个应用程序,即rails new Education
时,它将创建一个名为Education
的模块,如下所示
module Education
class Application < Rails::Application
#....
end
end
然后在config.ru
,routes.rb
和environment.rb
等文件中调用此命名模块。因此,如果您能够使用相同的名称创建模型类,则会产生关于您是在调用模型还是模块的模糊性。
答案 1 :(得分:1)
添加其他两个可能导致此错误的原因。
首先,您一直在更改名称,而旧名称仍然存在,因为这是一个缓存问题。
第二,它可能与您安装的gem发生命名冲突。因此,宝石已在使用您要使用的名称。
案例I ::缓存问题
我遇到了以下错误:
The name 'Activityflow' is either already used in your application or reserved by Ruby on Rails. Please choose an alternative and run this generator again.
在运行 rails g 时,如果您在初始行中看到以下消息,请执行以下操作。可能是缓存问题:
warning: previous definition of CALLBACK_CAMPAIGN_NAME was here
Running via Spring preloader in process 98806
invoke active_record
解决方案是致命的春天,它将释放缓存。
查找spring的进程ID
$ ps -ef | grep spring
501 82388 82384 0 2:21PM ?? 66:34.87 spring app | insurance | started 16 hours ago | development mode
501 82384 1 0 2:21PM ttys005 0:00.84 spring server | insurance | started 16 hours ago
杀死进程,例如:以上情况下为82384
$ kill -9 82384
然后,当您再次运行 rails g 命令时; Spring将以新内容运行/启动,并且模型创建成功。
Running via Spring preloader in process 99237
invoke active_record
create db/migrate/20200518021818_create_activityflows.rb
create app/models/activityflow.rb
invoke rspec
create spec/models/activityflow_spec.rb
案例II ::模块问题
我遇到了以下错误:
The name 'Workflow' is either already used in your application or reserved by Ruby on Rails. Please choose an alternative and run this generator again.
问题是我使用的是gem gem'workflow','〜> 2.0.2',它创建模块名称为Workflow,但不允许生成名为Workflow的模型。
因此,当您使用任何gem时,请务必小心,并且在任何gem中获取模块名称时 与型号名称匹配。
Simple way to check if module name exist is::
$ bin/rails c
[4] pry(main)> Workflow
=> Workflow
[5] pry(main)> Workflow.class
=> Module
答案 2 :(得分:0)
为了防患于未然,我犯了一个愚蠢的错误,并意外地运行了两次类似的代码行(它们都创建了一个“ Appointments”支架。这不是下面那样简单,但是我正在复制/粘贴)这些行中的某些内容(第一行成功,但是第二行由于明显的原因导致了错误)。
rails g scaffold Appointment user:references viewer:references start_time:datetime end_time:datetime
rails g scaffold Appointment user:references viewer:references start_time:datetime end_time:datetime
注意:该错误(很明显)可能是由于使用rails的保留字之一引起的。检查保留字的一种简单方法是https://reservedwords.herokuapp.com/words