如何重命名项目中的rails控制器和模型

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

我想把Corpspipe制员改成Stores而且模型也一样(没有最后的)。

看着谷歌,人们build议摧毁,然后再次生成控制器和模型。 问题是它会擦除每个文件的实际代码!

任何解决scheme 提前致谢。

这是我会做的:

创build一个迁移来更改表名称(数据库级别)。 我假设你的旧表被称为军团 。 迁移内容将是:

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

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

  • 文件重命名: corp.rb – > store.rb
  • store.rb代码:更改class Storeclass Store
  • 将所有模型关联重命名为has_many :corps – > has_many :stores

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

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

重命名视图文件夹。 从corpsstores

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

记得运行迁移:)

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

  $rake db:drop && rake db:create && rake db:migrate 

除了Nobita回答你同样需要改变testing辅助类的定义和文件名称的corps store更重要的是你应该改变corps store在你的config / routes.rb文件

所以总的来说,您正在对控制器,关联的模型,视图,助手,testing和路由文件进行更改。

我认为你所看到的destroygeneratebuild议是一个更好的select。 我已经给出了一个答案如何在这里做到这一点: Rails:重命名控制器和相应的模型

除了Nobita的回答(如果我有足够的代表,我会评论),如果你感觉很勇敢,那么对代码中的文件名和引用的改变可以自动化一些。 例如,要更改代码中的引用,可以使用

单数,减号和mayus:

 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的其他发行与一个不同的实用程序相同的名称(请参阅https://unix.stackexchange.com/questions/78621/find-rename-command-不工作; )。 在Ubuntu上你可以这样做:

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

请注意,您希望避免重命名数据库中的任何文件(除了可能在您的seeds.rb文件中除外),因此您可能希望排除此目录并手动进行任何更改。

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

 rename_column :table, :old_id, :new_id 

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

 belongs_to :new, foreign_key: "old_id" 

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

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

文件重命名:corp_test.rb – > store_test.rb(也用于控制器testing,集成testing,灯具等)

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

并在控制器,模型,集成,夹具testing的所有参考公司。

作为刚刚完成这个痛苦过程的人,最重要的一步是build立足够的testing来检查尽可能多的function。 他们不仅应该覆盖你打算重命名的模型/控制器,还应该涵盖所有其他的模型/控制器/视图部分。 无论如何,这是一个很好的(甚至是必须的)练习。

通过迭代来完成这个步骤,有时候你需要重复执行几次(5次以上)的步骤来发现需要修改的其他文件。 现在进行重命名步骤:

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

    耙db:drop:all

    耙db:创build

    耙db:迁移

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

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

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

  • 路线
  • 应用程序/意见
  • 应用程序/控制器
  • testing/控制器
  • 应用程序/帮手
  • 应用程序/资产/ JavaScript的/
  • 应用程序/资产/样式表/

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

你也可以试试Rails Refactor gem,它是简单的重构的命令行工具,比如重命名模型和Rails项目的控制器

用法:

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

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

安装:
gem install rails_refactor

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

重命名控制器:
rails_refactor rename OldController NewController

  • 在文件中重命名控制器文件和类名
  • 在文件中重命名控制器spec文件和类名
  • 重命名查看目录
  • 重命名文件中的助手文件和模块名称
  • 更新路线

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

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

重命名模型:
$ rails_refactor rename OldModel NewModel

  • 在文件中重命名模型文件和类名
  • 重命名文件中的spec文件和类名
  • 在文件中重命名迁移和类名称和表名