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

lbsnaicq  于 2022-12-20  发布在  Ruby
关注(0)|答案(8)|浏览(203)

我启动了一个Rails应用程序,一切正常。但是现在,我想重命名一个控制器和相关的模型:
我想将X1 M0 N1 X控制器更改为X1 M1 N1 X,并且模型也是如此(没有最终的S)。
看着谷歌,人们建议销毁控制器和模型,然后重新生成。问题是它会擦除每个文件的实际代码!
有什么办法?

ryhaxcpt

ryhaxcpt1#

我会这么做:
创建一个migration来更改表名(数据库级别)。我假设您的旧表名为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

重命名视图文件夹。从corpsstores
config/routes.rb文件中的路径进行必要的更改,如resources :corps-〉resources :stores,并确保代码中的所有引用从corps更改为stores(corps_path,...)

    • 请记住运行迁移:)**

如果前面的操作不可行,请尝试删除db/schema. rb并执行:

$ rake db:drop db:create db:migrate
kr98yfug

kr98yfug2#

除了Nobita的答案之外,您同样需要将corpstest&helper类定义和文件名更改为store更重要的是您应该在config/routes.rb文件中将corps更改为store
因此,总体而言,您正在对控制器、关联的模型、视图、助手、测试和路由文件进行更改。
我认为你所看到的destroygenerate是一个更好的选择。我在这里给出了如何做到这一点的答案:Rails : renaming a controlller and corresponding model

guykilcj

guykilcj3#

您也可以尝试Rails Refactorgem,这是一个命令行工具,用于简单的重构,如重命名Rails项目的模型和控制器

    • 用法:**

为rails项目提供基本的重命名和重构。虽然这些并不完美,但它们会为你做很多工作并节省你的时间。
在使用之前,建议您从干净的存储库状态开始,以便可以轻松地查看更改。
要安装:
第一个月
在使用之前,请确保您***cd到您的rails项目的根目录。***
要重命名控制器,请执行以下操作:
rails_refactor rename OldController NewController

  • 重命名控制器文件&文件中的类名
  • 重命名控制器规格文件&文件中的类名
  • 重命名视图目录
  • 重命名帮助文件&模块名在文件中
  • 更新路由

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

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

要重命名模型:
$ rails_refactor rename OldModel NewModel

  • 重命名模型文件&文件中的类名
  • 重命名spec文件&文件中的类名
  • 重命名迁移&文件中的类名&表名

...

wfypjpf4

wfypjpf44#

除了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)上有一个名为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文件除外),因此您可能希望排除此目录并手动进行任何更改。

7uhlpewt

7uhlpewt5#

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

rename_column :table, :old_id, :new_id

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

belongs_to :new, foreign_key: "old_id"

此外,如果资源包含图像,则它们通常存储在包含资源名称但(至少使用carrierwave)一旦资源名称更改,它们将被错误引用(文件位于“/uploads/old/image/1/pic.jpg”,但在“uploads/new/...”中查找),因此您必须删除并重新上传图像,将其移动到新路径,或者改变他们被寻找的地方。

6mzjoqzu

6mzjoqzu6#

如果进行模型测试,则需要更改:
文件重命名:corp_test.rb -〉store_test.rb(也用于控制器测试、集成测试、夹具等)
store_test.rb代码:将类CorpTest更改为类StoreTest。
以及所有的控制器,模型,集成,夹具测试的参考资料。

k97glaaz

k97glaaz7#

作为一个刚刚完成这个痛苦过程的人,最重要的一步是建立足够的测试来检查尽可能多的功能。它们应该不仅覆盖你计划重命名的模型/控制器,还应该覆盖所有其他模型/控制器/视图部分。无论如何,这是一个很好的(什至是必须的)实践。
重复执行这些步骤,有时候你需要返回到步骤几次(5次或更多),以发现需要更改的其他文件。现在是重命名步骤:
1.将Corps/Corp文件夹中包含的所有文件(名称和内容)更改为Stores/Store
1.尝试运行:
瑞克数据库:丢弃:全部
rake数据库:创建
rake数据库:迁移
1.更改db/seeds.rb文件的内容。
1.尝试运行:rake db:seed --trace(在此步骤中,您可能需要更改其他一些模型/控制器文件。)
1.更改test/fixtures文件。您可能不仅需要更改corp.yml,还需要更改其他相关文件(某些文件可能包含corp_id)。
1.尝试运行您的测试,最好使用固定的种子(添加:TESTOPTS="--seed=1981"或任何其它数字)
1.重命名为文件(名称和内容)小心有时你需要改变测试和其他应用程序文件

9nvpjoqh

9nvpjoqh8#

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

  • 路线
  • 应用程序/视图
  • 应用程序/控制器
  • 测试器/控制器
  • 应用程序/助手
  • 应用程序/资产/javascript/
  • 应用程序/资产/样式表/

作为模特,大雄的回答相当不错

相关问题