Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在项目中重命名rails控制器和模型_Ruby On Rails_Model_Controller_Rename - Fatal编程技术网

Ruby on rails 如何在项目中重命名rails控制器和模型

Ruby on rails 如何在项目中重命名rails控制器和模型,ruby-on-rails,model,controller,rename,Ruby On Rails,Model,Controller,Rename,我启动了一个Rails应用程序,一切正常。但现在,我想重命名控制器和关联模型: 我想将Corps控制器更改为Stores,并对模型进行相同的更改(没有最终的s) 在谷歌上,人们建议先销毁,然后再生成控制器和模型。问题是它会删除每个文件的实际代码 有解决办法吗?提前谢谢。以下是我要做的: 创建迁移以更改表名(数据库级别)。我想你的旧桌子叫兵团。迁移内容将是: class RenameCorpsToStores < ActiveRecord::Migration def change

我启动了一个Rails应用程序,一切正常。但现在,我想重命名控制器和关联模型:

我想将
Corps
控制器更改为
Stores
,并对模型进行相同的更改(没有最终的s)

在谷歌上,人们建议先销毁,然后再生成控制器和模型。问题是它会删除每个文件的实际代码


有解决办法吗?提前谢谢。

以下是我要做的:

创建迁移以更改表名(数据库级别)。我想你的旧桌子叫兵团。迁移内容将是:

class RenameCorpsToStores < ActiveRecord::Migration
  def change
    rename_table :corps, :stores
  end
end

除了Nobita answer,您同样需要将
兵团
测试助手类定义和文件名更改为
存储
更重要的是您应该在config/routes.rb文件中将
corps
更改为
store

因此,总的来说,您正在对控制器、关联模型、视图、帮助器、测试和路由文件进行更改


我认为您所看到的关于
destroy
generate
的建议是一个更好的选择。我在这里给出了一个答案:

另一个重要的事情是您需要更新模型关联,无论是手动重命名还是销毁并生成资源(因为它们存在于其他模型中),您都必须更新模型关联。您可以运行迁移以更改数据库中外键的列名,也可以更改代码中对这些外键的所有引用:

rename_column :table, :old_id, :new_id
或在声明使用旧外键的关联时设置自定义外键:

belongs_to :new, foreign_key: "old_id"

此外,如果您的资源包含图像,它们通常存储在包含资源名称的目录中,但(至少带有carrierwave),一旦资源名称更改,它们将被错误引用(文件位于“/uploads/old/image/1/pic.jpg”,但在“uploads/new/…”中查找),因此,您必须删除并重新上载图像,将其移动到新路径,或者更改正在查找图像的位置。

如果您有模型测试,则需要更改:

文件重命名:corp_test.rb->store_test.rb(也用于控制器测试、集成测试、夹具等)

store_test.rb代码:将类CorpTest更改为类StoreTest


以及控制器、模型、集成和夹具测试中对corp的所有引用。

除了Nobita的回答(如果我有足够的代表,我会对此进行评论)之外,如果您感到勇敢,那么代码中对文件名和模型引用的更改可以在某种程度上实现自动化。例如,要更改代码中的引用,可以使用

单数、负数和mayus:

grep -rl corp | xargs sed -i 's/corp/store/g'
grep -rl Corp | xargs sed -i 's/Corp/Store/g'
复数、减号和mayus(如果复数仅需要,则用单数替换复数,并在末尾加上s字符):

重命名文件:

find . -name '*corp*' -exec bash -c 'mv $0 ${0/corp/store}' {} \;

还有一个名为rename的实用程序,它可以在某些*nix风格(包括Slackware)上帮助您重命名文件:

shopt -s globstar
rename -v corps stores app/**/*corps* config/**/*corps* test/**/*corps*
检查重命名是你认为它是什么,但我知道其他发行版,如Ubuntu与一个相同的名称不同的实用程序(见)。在Ubuntu上,您可以这样做:

shopt -s globstar
rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps*

请注意,您希望避免重命名db/中的任何文件,但seeds.rb文件中可能除外,因此您可能希望排除此目录并手动进行任何更改。

作为刚刚完成此痛苦过程的人,最重要的步骤是构建足够的测试来检查尽可能多的功能。它们不仅应涵盖您计划重命名的模型/控制器,还应涵盖所有其他模型/控制器/视图零件。无论如何,这是一个好的(甚至是必须的)练习

一步一步地重复,有时您需要返回步骤几次(5次或更多次),以发现需要更改的其他文件。 现在是重命名步骤:

  • 将include
    Corps/Corp
    文件夹中的所有文件(名称和内容)更改为
    db/migrate
    文件夹中的
    Stores/Store
  • 尝试运行:

    rake db:drop:all

    rake数据库:创建

    rake数据库:迁移

  • 更改
    db/seeds.rb
    文件的内容

  • 尝试运行:
    rake db:seed--trace
    (在此步骤中,您可能需要更改一些其他模型/控制器文件。)
  • 更改
    test/fixture
    文件。您可能不仅需要更改corps.yml,还需要更改其他相关文件(某些文件可能包括corp_id)
  • 尝试运行您的测试,最好使用固定种子运行(添加:
    TESTOPTS=“--seed=1981”
    或任何其他数字)
  • 重命名为文件(名称和内容)有时需要更改测试和其他应用程序文件

  • 对于控制器,如果手动操作,则必须在以下位置进行更改:

    • 路线
    • 应用程序/视图
    • 应用程序/控制器
    • 测试/控制器
    • 应用程序/助手
    • app/assets/javascripts/
    • 应用程序/资产/样式表/
    对于模型,Nobita的答案非常好

    您也可以尝试gem,它是一个命令行工具,用于简单的重构,如重命名Rails项目的模型和控制器

    用法:

    rails项目的基本重命名和重构。虽然这些是 不完美,他们会为你们做很多工作,节省你们的时间

    在使用之前,建议您从干净的存储库状态开始 因此,您可以轻松地查看更改

    要安装:
    gem安装rails\u重构

    使用前,请确保将cd插入rails项目的根目录。

    要重命名控制器:
    rails\u重构重命名OldController NewController

    • 重命名文件中的控制器文件和类名
    • 重命名控制器等级库文件和类
      shopt -s globstar
      rename -v corps stores app/**/*corps* config/**/*corps* test/**/*corps*
      
      shopt -s globstar
      rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps*