【问题标题】:Name is already used or reserved by Ruby on Rails?名称已被 Ruby on Rails 使用或保留?
【发布时间】:2013-11-04 21:04:59
【问题描述】:

我使用以下命令创建了一个 rails 应用程序:

rails new Education

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

rails generate model Education name:string

运行时返回以下错误:

名称“教育”已在您的应用程序中使用,或者 由 Ruby on Rails 保留。请选择一个替代方案并运行它 再次生成器。

由于我刚刚创建了一个新应用程序并且只有一个其他模型,我很难思考 Rails 保留这样一个名称的任何原因?

对这个错误的来源以及如何解决它有什么想法吗?

(我已尝试将名称更改为其他名称,它按预期工作。由于名称确实符合其目的,除非没有其他方法,否则我不想更改其名称!)

我将 Ruby 2.0.0 与 Rails 4.0.0 和 PostgreSQL 一起使用

【问题讨论】:

  • 您是否也将您的应用程序称为教育?即rails new Education
  • 是的。你认为这就是为什么?
  • 这正是原因
  • 好的,谢谢。想给出一个我能接受的正确答案吗?

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


【解决方案1】:

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

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

然后在config.ruroutes.rbenvironment.rb 等文件中调用此命名模块。因此,如果您能够创建一个同名的模型类,那么您在调用模型还是模块时会产生歧义。

【讨论】:

    【解决方案2】:

    添加人们可能会收到此错误的另外两个可能原因。

    首先,您一直在更改名称,但旧名称仍然存在,因为这是一个缓存问题。

    其次,这可能是与您安装的 gem 的命名冲突。所以 gem 已经在使用你想使用的名字了。

    案例一:缓存问题

    我得到以下错误::

    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,它会释放缓存。

    查找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
    

    CASE 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
    

    【讨论】:

      【解决方案3】:

      以防万一它对其他人有帮助,我犯了一个愚蠢的错误,不小心运行了两次类似的代码行(他们都创建了一个“约会”脚手架。它不像下面那么简单,但我是在复制/粘贴沿着这些思路(第一行成功,但第二行由于显而易见的原因导致错误)。

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多