如何在项目中重命名Rails控制器和模型


91

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

我想将Corps控制器更改Stores为与模型相同的控制器(没有final)。

在Google上看,人们建议销毁控制器,然后再生成模型。问题在于它将删除每个文件的实际代码!

有什么办法吗?提前致谢。

Answers:


181

这是我会做的:

创建一个迁移以更改表名称(数据库级别)。我认为你的旧桌子叫军团。迁移内容将是:

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

更改您的模型文件名,模型类定义和模型关联:

  • 文件重命名:corp.rb->store.rb
  • 代码store.rb:更改class Corpclass Store
  • 重命名所有模型关联,例如has_many :corps->has_many :stores

更改您的控制器文件名和控制器类定义:

  • 文件重命名:corps_controller.rb->stores_controller.rb
  • 代码stores_controller.rb:更改class CorpsControllerclass StoresController

重命名视图文件夹。从corpsstores

config/routes.rb文件的路径中进行必要的更改,例如resources :corps-> resources :stores,并确保代码中的所有引用都从corps更改为store(corps_path,...)

记住要运行迁移:)

如果以前不可能,请尝试删除db / schema.rb并执行:

 $ rake db:drop db:create db:migrate

2
可能要提及更改config / routes.rb,将所有:corps路由指向:stores路由
tgf

1
我运行find -name "oldname_on_singular?*以获取要重命名的文件列表。然后我将其复制到calc上,在第二列和第三列上粘贴两次。在第一列中添加重命名命令,在最后一列中更改新名称,例如:git mv ./spec/views/oldname ./spec/views/new name
Eduardo Santana

主列表缺少使用@EduardoSantana提到的使用新模型/类名称编辑测试文件的信息。
user2953607

10

除了大雄回答你同样需要改变测试辅助类的定义和文件名称为corpsstore更重要的是,您应该在config / routes.rb文件中更改corpsstore

因此,总的来说,您将对Controller,关联的Model,Views,Helpers,Tests和Routes文件进行更改。

我认为您看到的关于destroy&的建议generate是更好的选择。我在这里给出了如何执行此操作的答案:Rails:重命名控制器和相应的模型


7

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

用法:

Rails项目的基本重命名和重构。尽管这些方法并不完美,但它们会为您完成很多工作并节省您的时间。

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

安装:
gem install rails_refactor

在使用之前,请确保CD到rails项目的根目录。

重命名控制器:
rails_refactor rename OldController NewController

  • 重命名控制器文件和文件中的类名
  • 重命名控制器规范文件和文件中的类名
  • 重命名视图目录
  • 重命名帮助文件和模块中的模块名称
  • 更新路线

要重命名控制器动作:
$ rails_refactor rename DummyController.old_action new_action

  • 重命名控制器类文件中的控制器动作
  • 重命名所有格式的视图文件

重命名模型:
$ rails_refactor rename OldModel NewModel

  • 重命名模型文件和文件中的类名
  • 重命名规范文件和文件中的类名
  • 重命名文件中的迁移,类名和表名

...


6

除了Nobita的答案(如果我有足够的代表,我会对此进行评论),如果您感觉很勇敢,则可以对代码中的文件名和模型引用进行自动更改。例如,要更改代码中的引用,您可以使用

单数,负数和五月形:

grep -rl corp | xargs sed -i 's/corp/store/g'
grep -rl Corp | xargs sed -i 's/Corp/Store/g'

复数,减号和Mayus(如果只需要复数和末尾的s字符,则单数替换复数):

grep -rl corps | xargs sed -i 's/corps/stores/g'
grep -rl Corps | xargs sed -i 's/Corps/Stores/g'

重命名文件:

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

在某些* nix版本(包括Slackware)上,有一个名为重命名的实用程序,它将帮助您重命名文件:

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

检查重命名是否符合您的想法,我知道其他发行版(如Ubuntu)附带相同名称的其他实用程序(请参阅/unix/78621/find-rename-command-不起作用)。在Ubuntu上,您可以这样做:

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

请注意,您要避免重命名db /中的任何文件(可能不在您的seed.rb文件中),因此您可能希望排除该目录并手动进行任何更改。


5

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

rename_column :table, :old_id, :new_id

或在声明使用旧外键的关联时设置自定义外键:

belongs_to :new, foreign_key: "old_id"

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


0

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

文件重命名:corp_test.rb-> store_test.rb(也用于控制器测试,集成测试,固定装置等)

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

以及corp在控制器,模型,集成,夹具测试中的所有参考。


0

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

逐步执行此步骤,有时您需要返回几次(5次或更多次)以发现需要更改的其他文件。现在进行重命名步骤:

  1. 更改的所有文件(名称和内容)将包括Corps/CorpStores/Storedb/migrate文件夹中
  2. 尝试运行:

    耙db:drop:all

    耙db:create

    耙db:migrate

  3. 更改db/seeds.rb文件内容。

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

0

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

  • 路线
  • 应用/视图
  • 应用/控制器
  • 测试/控制器
  • 应用/助手
  • 应用/资产/ javascript /
  • 应用/资产/样式表/

对于模特,大雄的回答相当不错

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.