我遇到了同样的问题,我相信我已经解决了。我希望找到一个简单的 Rails 生成器来转换它,但除非我错过了一些东西,否则这并不容易。但是,rails 确实比完全手动操作更容易。
关键是rails new 命令可以在现有应用程序上使用。请注意,此答案假设您知道如何使用 git 并在现有应用程序上使用它。
首先也是最重要的,创建一个新分支。这有两个功能,1)所以如果你搞砸了你不应该丢失你的工作(尽管它仍然可能是备份它的好时机,比如 GitHub),以及 2)所以你可以比较文件有在此过程之后发生冲突并检索此过程覆盖的任何工作(这对我来说并不多,但它很重要)。
在终端中,从您想要从仅 API 更改为标准的应用程序目录中。运行以下命令以上一个目录,然后让 rails 在现有目录上编写一个新项目。在第二个命令上使用与最初创建应用程序时相同的选项。例如,对我来说,我用-d postgresql --skip-turbolinks --skip-spring -T 替换了下面的[options],因为这些是我在创建应用程序时使用的选项。我正在使用--skip-bundle 标志,因为它可能会比您想要的更多地更改您的 Gemfile,并且您可能希望在捆绑之前将其中的一些更改回来。
$ cd ..
$ rails new your_app_name --skip-bundle [options]
现在,rails 将按照通常的流程为新应用创建所有文件,但这次它将跳过几乎所有文件,因为它们已经存在。它将在每个存在冲突的地方停止,这就是您需要逐个分析冲突的地方。
以下是对我有用的冲突文件:
- 在每一个上提交
d 以查看差异。
- 如果区别只是添加行,则使用
Y 允许它。这就是我们这样做的原因。
- 如果区别只是删除代码,则使用
n 拒绝它。
- 如果不同之处在于添加和删除代码,请记下该文件以在此过程之后返回。然后用
Y接受它。
完成后,使用 git 检查您写下的 (4) 中每个文件的差异。您会希望保留 rails 添加的更改,但您可能希望将删除的所有代码复制回去。这可能包括 Gemfile。
一个显着的区别是 Rails 将应用程序控制器从继承 ActionController::API 更改为 ActionController::Base。我想要每个控制器一个,所以我创建了一个新文件“app/controllers/api_controller.rb”。然后我将原始 ApplicationController 中的内容复制到新文件中,并将类名更改为 ApiController。然后我将所有现有的 API 控制器更改为从新的 ApiController 继承,而不是从 ApplicationController 继承。
完成后,运行bundle install 以安装添加到应用程序中的gems rails。
这对我有用。我希望它有所帮助。祝你好运!