,我开始一个Rails应用程序,一切工作正常。 但现在,我想重命名控制器和相关型号:
我想改变Corps
控制器Stores
的模型和相同的(没有最终的S)。
展望谷歌,人们认为破坏,然后再生成控制器和模型。 问题是,它会清除每个文件的实际代码!
任何解决方案? 提前致谢。
,我开始一个Rails应用程序,一切工作正常。 但现在,我想重命名控制器和相关型号:
我想改变Corps
控制器Stores
的模型和相同的(没有最终的S)。
展望谷歌,人们认为破坏,然后再生成控制器和模型。 问题是,它会清除每个文件的实际代码!
任何解决方案? 提前致谢。
这里是我会做什么:
创建迁移到更改表名(数据库级)。 我想你的旧表被称为军团 。 迁移的内容将是:
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_path,...)
请记住,运行迁移:)
如果以前是不可能的,试着删除DB / schema.rb和执行:
$ rake db:drop db:create db:migrate
除了大雄回答你同样需要改变测试和辅助类的定义和文件名的corps
到store
。 更重要的是 ,你应该改变corps
以store
在你的config / routes.rb中文件
因此,在总,你是要修改的控制器,关联的模型,视图,helper,测试和路线文件。
我想你所看到的与建议destroy
和generate
是一个更好的选择。 我给了一个答案如何在这里做到这一点: Rails的:重命名controlller和相应的模型
我除了大雄的答案(我会发表评论,如果我有足够的代表处),如果你感觉勇敢然后更改文件名和引用代码中的模型可以稍微自动化。 例如,改变你的代码,你可以使用引用
奇异,减和mayus:
grep -rl corp | xargs sed -i 's/corp/store/g'
grep -rl Corp | xargs sed -i 's/Corp/Store/g'
复数,减和mayus(单取代多,如果多只在端需要和性格):
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具有相同名称的不同效用船(见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为单位的任何文件,除了可能在你的seeds.rb文件,所以你可能要在此目录中排除,并手动进行任何更改。
另一个重要的事情是,你需要更新模型协会,你必须做你是否手动重命名或破坏,并产生资源(因为他们在其他车型存在)。 您可以运行迁移更改数据库中的外键的列名和更改代码中的外键的所有引用:
rename_column :table, :old_id, :new_id
或宣称使用旧的外键关联时设置自定义外键:
belongs_to :new, foreign_key: "old_id"
此外,如果你的资源包括图像,它们通常存储在包括资源名称,但一个目录(与carrierwave至少)一次资源的名称改变,他们会被错误引用(文件存在于“/上传/老/图像/ 1 / pic.jpg“而是看在‘上传/新/ ...’),所以你必须要么删除并重新上传图片,将它们移动到新的路径,或者改变他们”再被查找。
您可以尝试Rails的重构宝石也为简单的refactors像重命名模型和控制器为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
- 在重命名文件模型文件和类名
- 在重命名文件规范文件和类名
- 在重命名文件迁移和类名和表名
...
如果你有模型试验,你需要改变:
文件重命名:corp_test.rb - > store_test.rb(也为控制器测试,集成测试,夹具等)
store_test.rb的代码:更改类CorpTest类StoreTest。
而在控制器,模型,集成,测试夹具的总公司的所有引用。
正如有人说只是完成这个痛苦的过程中最重要的一步是建立足够的测试 ,以检查尽可能多的功能成为可能。 他们不仅应包括模型/控制器,您打算重命名,而且所有其他型号/控制器/视图部分。 总之这是一个很好的(或者甚至是一个必须的)做法。
通过反复做这个步骤,有时你需要复出步骤几次(5以上)的发现,需要更改其他文件。 现在对于重命名步骤:
Corps/Corp
来Stores/Store
在db/migrate
文件夹 试运行:
耙分贝:降:所有
耙分贝:创建
耙分贝:迁移
变更内容db/seeds.rb
文件。
rake db:seed --trace
(在此步骤中,您可能需要改变一些其他型号/控制器中的文件。) test/fixtures
文件。 你可能需要改变的不仅仅是corps.yml但其他相关文件(有些文件可能包括corp_id)。 TESTOPTS="--seed=1981"
或任何其他数字) 对于控制器,你将不得不作出改变,如果你做手工以下地方:
为模型,大雄的答案是相当不错的