【问题标题】:Rails REST API and ViewsRails REST API 和视图
【发布时间】:2017-05-08 12:55:00
【问题描述】:

我正在创建一个 Rails 应用程序,它的用户有两种交互方式。

通过网络界面和 API(移动应用和其他软件)。

web 和 api 访问的功能是相同的,例如用户可以通过 web 界面(视图)或通过 API 写评论。

我现在要做的是创建所有带有视图的控制器,然后创建一个名称空间 /API/ 及其自己的控制器。现在的问题当然是我要写两次写评论的函数。一次在我的 PostController 中,一次在我的 API/PostController 中。

我知道 Rails = DRY,所以我想我做错了什么。

我如何为我的视图和我的 API(JSON 响应)同时提供相同的功能。

路由和命名空间会是什么样子?我认为即使我找到了一种不重复自己的方法,拥有像 api/v1/ 这样的 API 路由也会很好......

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我做过类似的事情,既使用 API 命名空间控制器,也使用单个控制器。

    由于您似乎确信您可以在 Web 界面中像 API 界面一样平等地执行所有操作,因此将两者合并是有意义的,但请注意这并不总是正确的。

    如果使用单个控制器对您来说更有意义,那么您需要做的是使用 repond_to 格式的请求来单个控制器操作。

    例如:

    class ArticlesController < ApplicationController
      def index
        @articles = Article.all
        respond_to do |format|
          format.html # will render a view by default
          format.json { render json: @articles }
        end
      end
    
      def create
        article = current_user.articles.build(article_params)
    
        respond_to do |format|
          if article.save
            flash[:notice] = "success!"
          else
            flash[:error] = "uhoh!"
          end
    
          format.html # renders a view by default
          format.json { render json: { errors: @articles.errors }
        end
      end
    
      private
    
      def article_params
        params.require(:article).permit(:title, :content)
      end
    end
    

    【讨论】:

    • 在您的回答中 - 如果我是其他需要使用此应用程序数据的应用程序,我会请求 example.com/articles/index 吗? ArticlesController 怎么知道我想要 JSON 数据?我也在尝试学习更多关于构建 API 的知识。
    • Rails 控制器可以使用format 更改请求流。从来没有请求过/articles/index,它的格式总是在 URL 中或 Content-Type 中:articles/index.html。如果您不知道 respond_toformat 做什么,而我的答案包含该代码,您不认为先研究一下这个很聪明吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2012-07-24
    • 2016-11-10
    • 2016-07-02
    • 2012-10-20
    相关资源
    最近更新 更多