Ruby on Rails已经使用或保留了名称?

时间:2013-11-04 21:04:59

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-2.0

我正在尝试使用以下命令在rails中创建一个新模型:

rails generate model Education name:string

运行时会返回以下错误:

  

“教育”这个名称已经在你的申请中使用过了   由Ruby on Rails保留。请选择一个替代方案并运行它   发电机再次。

由于我刚刚创建了一个新的app并且只有一个其他模型,因此该应用程序中没有使用该名称,而且我很难想出为什么Rails会保留这样的名称的原因?

有关此错误来自何处以及如何解决此问题的任何想法?

(我已经尝试将名称更改为其他内容并且按预期工作。由于名称确实符合其目的,我不想更改其名称,除非没有别的办法!)

我正在使用Ruby 2.0.0和Rails 4.0.0以及PostgreSQL

3 个答案:

答案 0 :(得分:27)

您可能无法创建与Application同名的模型,因为它会创建冲突的名称。当您创建一个应用程序,即rails new Education时,它将创建一个名为Education的模块,如下所示

module Education
  class Application < Rails::Application
  #....
  end
end

然后在config.ruroutes.rbenvironment.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