如何将 Rails 5 API 应用程序转换为既可以作为 API 又可以作为应用程序的 Rails 应用程序?

Posted

技术标签:

【中文标题】如何将 Rails 5 API 应用程序转换为既可以作为 API 又可以作为应用程序的 Rails 应用程序?【英文标题】:How do you convert a Rails 5 API app to a rails app that can act as both API and app? 【发布时间】:2016-08-08 18:35:11 【问题描述】:

我最初是在 rails 5 中使用 --api 标签创建的。

来自http://edgeguides.rubyonrails.org/api_app.html

我删除了config.api_only = true

我变了

class ApplicationController < ActionController::API
end

class ApplicationController < ActionController::Base
end

我现在遇到的问题是视图何时呈现,例如。 welcome/index.html.erb,对应的CSS文件assets/stylesheets/welcome.css.scss没有。

知道如何解决这个问题,或者更普遍地将 API 应用程序转换为完整的应用程序吗?

谢谢!

【问题讨论】:

更新并删除了“后退”部分。它最初从来不是一个常规的 Rails 应用程序,它最初是一个 api 应用程序。 【参考方案1】:

我遇到了同样的问题,我相信我已经解决了。我希望找到一个简单的 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。

这对我有用。我希望它有所帮助。祝你好运!

【讨论】:

这很棒。我刚刚编辑它以将“y”更改为“Y”,因为这是所需的实际响应。【参考方案2】:

从 api 应用程序外部的目录(例如它的父级 - cd ..)我会这样做

rails new comparison_real_app

然后将comparison_real_app 的内容与您的应用程序进行比较,并将缺少的文件复制到 api 应用程序中,并根据需要更改任何其他文件。

【讨论】:

注意:您可以使用meld(或其他 GUI 工具)来获取两个文件夹之间的差异,并根据具体情况合并更改。 Mac 用户:brew cask install meld【参考方案3】:

因此,在我(您)的工作中,可能还有更多事情需要完成,但要解决样式表问题,您需要手动创建 views/layouts/application.html.erbassets/stylesheets/application.css 文件。

【讨论】:

以上是关于如何将 Rails 5 API 应用程序转换为既可以作为 API 又可以作为应用程序的 Rails 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

将Chartkick与rails 5.2 api应用集成?

如何将此查询转换为ActiveRecord(Rails 5)

Rails API 回形针。上传图像将其转换为 base 64 并保存并检索它

Rails 5-如何将数据从 xls 文件导入数据库

Nginx 正在将自定义 http 代码转换为 502 错误网关

如何将 React Native 应用程序上的本地图像文件上传到 Rails api?