我启动了一个 Rails 应用程序,一切正常。但现在,我想重命名一个控制器和关联的模型:
我想将Corps
控制器更改Stores
为模型的相同(没有 final s)。
看谷歌,人们建议销毁然后重新生成控制器和模型。问题是它会删除每个文件的实际代码!
有什么解决办法吗?提前致谢。
我启动了一个 Rails 应用程序,一切正常。但现在,我想重命名一个控制器和关联的模型:
我想将Corps
控制器更改Stores
为模型的相同(没有 final s)。
看谷歌,人们建议销毁然后重新生成控制器和模型。问题是它会删除每个文件的实际代码!
有什么解决办法吗?提前致谢。
这是我要做的:
创建迁移以更改表名(数据库级别)。我假设您的旧表称为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
重命名视图文件夹。从corps
到stores
。
config/routes.rb
对文件中的路径进行必要的更改,例如resources :corps
-> resources :stores
,并确保代码中的所有引用都从 corps 更改为 stores (corps_path, ...)
记得运行迁移:)
如果以前不可行,请尝试删除 db/schema.rb 并执行:
$ rake db:drop db:create db:migrate
除了 Nobita 回答之外,您同样需要将测试和助手类定义和文件名更改corps
为store
. 更重要的是,您应该在config/routes.rb文件中更改corps
为store
因此,总的来说,您正在对控制器、关联的模型、视图、帮助程序、测试和路由文件进行更改。
我认为你所看到的destroy
&generate
是一个更好的选择。我在这里给出了如何做到这一点的答案:Rails:重命名控制器和相应的模型
您也可以尝试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
- 重命名文件中的模型文件和类名
- 重命名规范文件和文件中的类名
- 重命名文件中的迁移和类名和表名
...
我除了大雄的回答(如果我有足够的代表我会评论),如果你觉得勇敢,那么代码中对文件名和对模型的引用的更改可以在某种程度上自动化。例如,要更改代码中的引用,您可以使用
单数、减号和马尤斯:
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-不工作)。在 Ubuntu 上,您可以这样做:
shopt -s globstar
rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps*
请注意,您希望避免重命名 db/ 中的任何文件,除了可能在您的种子.rb 文件中,因此您可能希望排除此目录并手动进行任何更改。
另一件重要的事情是您需要更新模型关联,无论您是手动重命名还是销毁并生成资源(因为它们存在于其他模型中),您都必须这样做。您可以运行迁移以更改数据库中外键的列名,并更改代码中对这些外键的所有引用:
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 在控制器、模型、集成、夹具测试中的所有引用。
作为刚刚完成这个痛苦过程的人,最重要的一步是构建足够的测试来检查尽可能多的功能。它们不仅应涵盖您计划重命名的模型/控制器,还应涵盖所有其他模型/控制器/视图部分。无论如何,这是一个很好的(甚至可能是必须的)实践。
通过迭代执行此步骤,有时您需要多次返回步骤(5 次或更多)以发现需要更改的其他文件。现在进行重命名步骤:
Corps/Corp
为Stores/Store
文件db/migrate
夹尝试运行:
耙 db:drop:all
耙分贝:创建
耙分贝:迁移
更改db/seeds.rb
文件内容。
rake db:seed --trace
在此步骤中您可能需要更改一些其他模型/控制器文件。)test/fixtures
文件。您可能不仅需要更改 corps.yml,还需要更改其他相关文件(某些文件可能包含 corp_id)。TESTOPTS="--seed=1981"
或任何其他数字)对于控制器,如果您手动进行,则必须在以下位置进行更改:
对于模特,大雄的回答还不错