如何在项目中重命名rails controller和model

时间:2012-08-12 17:11:30

标签: ruby-on-rails model controller rename

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

我想将Corps控制器更改为Stores,并将模型更改为(没有最终版本)。

在谷歌上看,人们建议销毁然后再次生成控制器和型号。问题是它会删除每个文件的实际代码!

任何解决方案?提前谢谢。

8 个答案:

答案 0 :(得分:170)

以下是我要做的事情:

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

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

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

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

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

  • 文件重命名:corps_controller.rb - &gt; stores_controller.rb
  • stores_controller.rb代码:更改class CorpsController
  • class StoresController

重命名视图文件夹。从corpsstores

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

请记得运行迁移:)

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

 $ rake db:drop db:create db:migrate

答案 1 :(得分:9)

除了大雄回答你同样需要改变测试&amp; 帮助类定义&amp; corpsstore的文件名。 更重要您应该在 config / routes.rb 文件中将corps更改为store

总而言之,您正在对Controller,关联的模型,视图,助手,测试和路由文件进行更改。

我认为您在destroy&amp; generate是更好的选择。我在这里给出了如何做到这一点的答案:Rails : renaming a controlller and corresponding model

答案 2 :(得分:6)

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

单数,减号和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)上有一个名为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 /中的任何文件,但可能在seeds.rb文件中,因此您可能希望排除此目录并手动进行任何更改。

答案 3 :(得分:5)

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

rename_column :table, :old_id, :new_id

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

belongs_to :new, foreign_key: "old_id"

此外,如果您的资源包含图像,它们通常存储在包含资源名称的目录中,但(至少使用carrierwave)一旦资源名称发生更改,它们将被错误地引用(文件存在) at&#39; /uploads/old/image/1/pic.jpg'但是会在&#39; uploads / new /...')中寻找,所以你必须删除并重新上传图片,将其移至新路径,或者更改他们正在寻找的位置。

答案 4 :(得分:4)

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

<强>用法:

  

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

     

使用之前,建议您从干净的存储库状态开始   这样您就可以轻松查看更改。

     

安装:
  gem install rails_refactor

     

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

     

重命名控制器:
  rails_refactor rename OldController NewController

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

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

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

重命名模型:
  $ rails_refactor rename OldModel NewModel

     
      
  • 重命名模型文件&amp;文件中的类名
  •   
  • 重命名规范文件&amp;文件中的类名
  •   
  • 重命名迁移&amp;班级名称&amp;文件中的表名
  •   
     

...

答案 5 :(得分:0)

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

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

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

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

答案 6 :(得分:0)

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

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

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

    rake db:drop:all

    rake db:create

    rake db:migrate

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

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

答案 7 :(得分:0)

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

  • 路线
  • 应用程序/观点
  • 应用程序/控制器
  • 测试/控制器
  • 应用程序/辅助
  • 应用程序/资产/ Javascript角/
  • 应用程序/资产/样式表/

对于模特来说,大雄的答案非常好