我启动了一个Rails应用程序,一切正常。但是现在,我想重命名一个控制器和相关的模型:我想将X1 M0 N1 X控制器更改为X1 M1 N1 X,并且模型也是如此(没有最终的S)。看着谷歌,人们建议销毁控制器和模型,然后重新生成。问题是它会擦除每个文件的实际代码!有什么办法?
ryhaxcpt1#
我会这么做:创建一个migration来更改表名(数据库级别)。我假设您的旧表名为corps。迁移内容将是:
class RenameCorpsToStores < ActiveRecord::Migration def change rename_table :corps, :stores end end
更改模型文件名、模型类定义和模型关联:
corp.rb
store.rb
class Corp
class Store
has_many :corps
has_many :stores
更改控制器文件名和控制器类定义:
corps_controller.rb
stores_controller.rb
class CorpsController
class StoresController
重命名视图文件夹。从corps到stores。对config/routes.rb文件中的路径进行必要的更改,如resources :corps-〉resources :stores,并确保代码中的所有引用从corps更改为stores(corps_path,...)
corps
stores
config/routes.rb
resources :corps
resources :stores
如果前面的操作不可行,请尝试删除db/schema. rb并执行:
$ rake db:drop db:create db:migrate
kr98yfug2#
除了Nobita的答案之外,您同样需要将corps的test&helper类定义和文件名更改为store。更重要的是您应该在config/routes.rb文件中将corps更改为store因此,总体而言,您正在对控制器、关联的模型、视图、助手、测试和路由文件进行更改。我认为你所看到的destroy和generate是一个更好的选择。我在这里给出了如何做到这一点的答案:Rails : renaming a controlller and corresponding model
store
destroy
generate
guykilcj3#
您也可以尝试Rails Refactorgem,这是一个命令行工具,用于简单的重构,如重命名Rails项目的模型和控制器
为rails项目提供基本的重命名和重构。虽然这些并不完美,但它们会为你做很多工作并节省你的时间。在使用之前,建议您从干净的存储库状态开始,以便可以轻松地查看更改。要安装:第一个月在使用之前,请确保您***cd到您的rails项目的根目录。***要重命名控制器,请执行以下操作:rails_refactor rename OldController NewController
rails_refactor rename OldController NewController
要重命名控制器动作:$ rails_refactor rename DummyController.old_action new_action
$ rails_refactor rename DummyController.old_action new_action
要重命名模型:$ rails_refactor rename OldModel NewModel
$ rails_refactor rename OldModel NewModel
...
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文件除外),因此您可能希望排除此目录并手动进行任何更改。
7uhlpewt5#
还有一件重要的事情是,你需要更新模型关联,无论你是手动重命名还是销毁并生成资源(因为它们存在于其他模型中),你都必须这样做,你可以运行迁移来更改数据库中外键的列名,并更改代码中对这些外键的所有引用:
rename_column :table, :old_id, :new_id
或在声明使用旧外键的关联时设置自定义外键:
belongs_to :new, foreign_key: "old_id"
此外,如果资源包含图像,则它们通常存储在包含资源名称但(至少使用carrierwave)一旦资源名称更改,它们将被错误引用(文件位于“/uploads/old/image/1/pic.jpg”,但在“uploads/new/...”中查找),因此您必须删除并重新上传图像,将其移动到新路径,或者改变他们被寻找的地方。
6mzjoqzu6#
如果进行模型测试,则需要更改:文件重命名:corp_test.rb -〉store_test.rb(也用于控制器测试、集成测试、夹具等)store_test.rb代码:将类CorpTest更改为类StoreTest。以及所有的控制器,模型,集成,夹具测试的参考资料。
k97glaaz7#
作为一个刚刚完成这个痛苦过程的人,最重要的一步是建立足够的测试来检查尽可能多的功能。它们应该不仅覆盖你计划重命名的模型/控制器,还应该覆盖所有其他模型/控制器/视图部分。无论如何,这是一个很好的(什至是必须的)实践。重复执行这些步骤,有时候你需要返回到步骤几次(5次或更多),以发现需要更改的其他文件。现在是重命名步骤:1.将Corps/Corp文件夹中包含的所有文件(名称和内容)更改为Stores/Store1.尝试运行:瑞克数据库:丢弃:全部rake数据库:创建rake数据库:迁移1.更改db/seeds.rb文件的内容。1.尝试运行:rake db:seed --trace(在此步骤中,您可能需要更改其他一些模型/控制器文件。)1.更改test/fixtures文件。您可能不仅需要更改corp.yml,还需要更改其他相关文件(某些文件可能包含corp_id)。1.尝试运行您的测试,最好使用固定的种子(添加:TESTOPTS="--seed=1981"或任何其它数字)1.重命名为文件(名称和内容)小心有时你需要改变测试和其他应用程序文件
Corps/Corp
Stores/Store
db/seeds.rb
rake db:seed --trace
test/fixtures
TESTOPTS="--seed=1981"
9nvpjoqh8#
对于控制器,如果您正在 * 手动 * 进行更改,则必须在以下位置进行更改:
作为模特,大雄的回答相当不错
8条答案
按热度按时间ryhaxcpt1#
我会这么做:
创建一个migration来更改表名(数据库级别)。我假设您的旧表名为corps。迁移内容将是:
更改模型文件名、模型类定义和模型关联:
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更改为stores(corps_path,...)如果前面的操作不可行,请尝试删除db/schema. rb并执行:
kr98yfug2#
除了Nobita的答案之外,您同样需要将
corps
的test&helper类定义和文件名更改为store
。更重要的是您应该在config/routes.rb文件中将corps
更改为store
因此,总体而言,您正在对控制器、关联的模型、视图、助手、测试和路由文件进行更改。
我认为你所看到的
destroy
和generate
是一个更好的选择。我在这里给出了如何做到这一点的答案:Rails : renaming a controlller and corresponding modelguykilcj3#
您也可以尝试Rails Refactorgem,这是一个命令行工具,用于简单的重构,如重命名Rails项目的模型和控制器
为rails项目提供基本的重命名和重构。虽然这些并不完美,但它们会为你做很多工作并节省你的时间。
在使用之前,建议您从干净的存储库状态开始,以便可以轻松地查看更改。
要安装:
第一个月
在使用之前,请确保您***cd到您的rails项目的根目录。***
要重命名控制器,请执行以下操作:
rails_refactor rename OldController NewController
要重命名控制器动作:
$ rails_refactor rename DummyController.old_action new_action
要重命名模型:
$ rails_refactor rename OldModel NewModel
...
wfypjpf44#
除了Nobita的回答(如果我有足够的代表,我会对此发表评论),如果你觉得勇敢,那么在你的代码中对文件名和模型引用的修改可以在一定程度上自动化。
单数、减号和mayus:
复数、减号和mayus(如果复数只需要末尾加s字符,则用单数代替复数):
重命名文件:
在一些 *nix风格(包括Slackware)上有一个名为rename的实用程序,可以帮助您重命名文件:
检查重命名是否如你所想,我知道其他发行版比如Ubuntu也有相同名称的不同实用程序(参见https://unix.stackexchange.com/questions/78621/find-rename-command-doesnt-work)。在Ubuntu上你可以这样做:
请注意,您希望避免重命名db/中的任何文件(seeds.rb文件除外),因此您可能希望排除此目录并手动进行任何更改。
7uhlpewt5#
还有一件重要的事情是,你需要更新模型关联,无论你是手动重命名还是销毁并生成资源(因为它们存在于其他模型中),你都必须这样做,你可以运行迁移来更改数据库中外键的列名,并更改代码中对这些外键的所有引用:
或在声明使用旧外键的关联时设置自定义外键:
此外,如果资源包含图像,则它们通常存储在包含资源名称但(至少使用carrierwave)一旦资源名称更改,它们将被错误引用(文件位于“/uploads/old/image/1/pic.jpg”,但在“uploads/new/...”中查找),因此您必须删除并重新上传图像,将其移动到新路径,或者改变他们被寻找的地方。
6mzjoqzu6#
如果进行模型测试,则需要更改:
文件重命名:corp_test.rb -〉store_test.rb(也用于控制器测试、集成测试、夹具等)
store_test.rb代码:将类CorpTest更改为类StoreTest。
以及所有的控制器,模型,集成,夹具测试的参考资料。
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.重命名为文件(名称和内容)小心有时你需要改变测试和其他应用程序文件
9nvpjoqh8#
对于控制器,如果您正在 * 手动 * 进行更改,则必须在以下位置进行更改:
作为模特,大雄的回答相当不错