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

hta*_*irt 87 controller model rename ruby-on-rails

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

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

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

有解决方案吗 提前致谢.

Nob*_*ita 178

这是我要做的:

创建迁移以更改表名(数据库级别).我假设你的旧桌子叫做军团.迁移内容将是:

class RenameCorpsToStores < ActiveRecord::Migration
  def change
    rename_table :corps, :stores
  end
end
Run Code Online (Sandbox Code Playgroud)

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

  • 文件重命名:corp.rb- >store.rb
  • 守则store.rb:更改class Corpclass Store
  • 重命名所有模型关联,例如has_many :corps- >has_many :stores

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

  • 文件重命名:corps_controller.rb- >stores_controller.rb
  • 守则stores_controller.rb:更改class CorpsControllerclass StoresController

重命名视图文件夹.从corpsstores.

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

记得运行迁移:)

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

 $ rake db:drop db:create db:migrate
Run Code Online (Sandbox Code Playgroud)

  • 可能要提到更改config/routes.rb以将所有:corps路由指向:存储路由 (2认同)

Hol*_*lly 10

除了大雄回答你同样需要改变测试辅助类的定义和文件名称为corpsstore. 更重要的是,您应该在config/routes.rb文件中更改corpsstore

所以总的来说,你要对Controller,相关的模型,视图,助手,测试和路由文件进行更改.

我认为你所看到的建议是destroy&generate更好的选择.我在这里给出了如何做到这一点的答案:Rails:重命名控制器和相应的模型


Asm*_*ust 7

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

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

...


Dan*_*Dan 6

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

奇异,减号和mayus:

grep -rl corp | xargs sed -i 's/corp/store/g'
grep -rl Corp | xargs sed -i 's/Corp/Store/g'
Run Code Online (Sandbox Code Playgroud)

复数,减号和mayus(单数替换复数,如果复数只需要和s字符末尾):

grep -rl corps | xargs sed -i 's/corps/stores/g'
grep -rl Corps | xargs sed -i 's/Corps/Stores/g'
Run Code Online (Sandbox Code Playgroud)

重命名文件:

find . -name '*corp*' -exec bash -c 'mv $0 ${0/corp/store}' {} \;
Run Code Online (Sandbox Code Playgroud)

并且在一些*nix版本(包括Slackware)上有一个名为rename的实用程序,它将帮助您重命名文件:

shopt -s globstar
rename -v corps stores app/**/*corps* config/**/*corps* test/**/*corps*
Run Code Online (Sandbox Code Playgroud)

检查重命名是你认为的,我知道其他发行版如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*
Run Code Online (Sandbox Code Playgroud)

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


Pwn*_*rar 5

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

rename_column :table, :old_id, :new_id
Run Code Online (Sandbox Code Playgroud)

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

belongs_to :new, foreign_key: "old_id"
Run Code Online (Sandbox Code Playgroud)

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