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

Posted

技术标签:

【中文标题】如何在项目中重命名 Rails 控制器和模型【英文标题】:How to rename rails controller and model in a project 【发布时间】:2012-08-09 01:57:20 【问题描述】:

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

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

看谷歌,有人建议销毁然后重新生成控制器和模型。问题是它会擦除每个文件的实际代码!

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

【问题讨论】:

【参考方案1】:

我会这样做:

创建迁移以更改表名(数据库级别)。我假设您的旧表名为 corps。迁移内容为:

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

更改模型文件名、模型类定义和模型关联:

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

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

文件重命名:corps_controller.rb -> stores_controller.rb stores_controller.rb 的代码:将 class CorpsController 更改为 class StoresController

重命名视图文件夹。从corpsstores

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

记得运行迁移 :)

如果之前的不可行,尝试删除db/schema.rb并执行:

 $ rake db:drop db:create db:migrate

【讨论】:

可能要提及更改 config/routes.rb 以将所有 :corps 路由指向 :stores 路由 我运行find -name "oldname_on_singular?* 来获取要重命名的文件列表。然后我在 calc 上复制它,在第二列和第三列粘贴两次。在第一列我添加重命名命令,在最后一列我更改为新名称,例如:git mv ./spec/views/oldname ./spec/views/new name 主列表缺少使用@EduardoSantana 提到的新模型/类名称编辑测试文件。 rake db:drop 超级危险!我建议您删除此行以将其更改为“rake db:migrate”!人们有复制粘贴和逃跑的倾向!【参考方案2】:

除了大雄的回答,您同样需要将corpstest & helper 类定义和文件名更改为store更重要的是您应该在 config/routes.rb 文件中将 corps 更改为 store

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

我认为您所看到的 destroygenerate 建议是更好的选择。我在这里给出了如何做到这一点的答案:Rails : renaming a controlller and corresponding model

【讨论】:

【参考方案3】:

您也可以尝试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

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

...

【讨论】:

【参考方案4】:

除了大雄的回答(如果我有足够的代表,我会评论),如果你觉得勇敢,那么在代码中对文件名和对模型的引用的更改可以在某种程度上自动化。例如,要更改代码中的引用,您可以使用

单数、减号和可能:

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)上有一个名为 rename 的实用程序,可以帮助您重命名文件:

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

检查重命名是您的想法,但我知道其他发行版(例如 Ubuntu)会附带同名的不同实用程序(请参阅 https://unix.stackexchange.com/questions/78621/find-rename-command-doesnt-work)。在 Ubuntu 上,您可以这样做:

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

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

【讨论】:

【参考方案5】:

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

rename_column :table, :old_id, :new_id

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

belongs_to :new, foreign_key: "old_id"

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

【讨论】:

【参考方案6】:

如果你有模型测试,你需要改变:

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

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

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

【讨论】:

【参考方案7】:

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

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

    db/migrate文件夹中包含Corps/Corp的所有文件(名称和内容)更改为Stores/Store

    尝试运行:

    rake db:drop:all

    耙数据库:创建

    rake db:迁移

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

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

【讨论】:

【参考方案8】:

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

路线 应用/视图 应用程序/控制器 测试/控制器 应用/助手 app/assets/javascripts/ 应用程序/资产/样式表/

对于模特来说,大雄的回答还不错

【讨论】:

以上是关于如何在项目中重命名 Rails 控制器和模型的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 Rails 脚手架将模型放入命名空间

如何在 Rails 4 中使用关注点

如何在 Visual Studio 2008 中重命名现有解决方案和项目? [复制]

如何在 Laravel 7 中重命名项目

如何在 Xcode 5 中重命名项目?

如何在Sonarqube中重命名项目