Ruby on Rails 路由资源和资源错误响应

如何解决Ruby on Rails 路由资源和资源错误响应

我有一个运行在 Ruby 2.6.6 上的 Ruby on Rails 5.2.4。前端期望后端返回的数据是基于以下结构的 JSON:“资源”(如果有数据列表)或“资源”(如果只有一个数据)。

该应用程序是为 Rails 5.0 创建的,我做了一些更新,因此它也可以在 Rails 5.2 上正常运行。也许我错过了什么。

routes.rb 看起来像:

resources :route_a,only: [:index,:show]
resources :route_b,only: [:index]
resources :route_c,only: [:create]
resource  :route_d,only: [:create,:update,:destroy]
...
resources :route_e,only: [] do
  resource :route_f,only: [] do
    post 'route_g',on: :member
  end
end

前端 Javascript 框架期望返回的数据包含“资源”或“资源”键。但在 80% 的情况下,数据不会返回资源/资源结构化 JSON。 Rails 有什么问题?这个问题是否与 gem、数据库有关?为什么对于某些路由,响应在资源/资源结构化数据中返回,而对于其他路由,则返回纯 JSON?

响应如:

[{"id":33,"type":"M..

我需要:

[{"resources":{"id":33,"type":"M...

我是 Rails 的新手,很抱歉可能会问一些基本的问题,但我不知道这里有什么问题。谢谢。

更新 - arieljoud 的评论

我有一个文件config/initializers/wrap_parameters.rb,其中包含:

# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
ActiveSupport.on_load(:action_controller) do
  wrap_parameters format: [:json]
end

# To enable root element in JSON for ActiveRecord objects.
# ActiveSupport.on_load(:active_record) do
#   self.include_root_in_json = true
# end

Update2 - 供 TTD 评论

这是 /api/integrations 页面控制器:

class IntegrationsController < ApiController

def index
    integrations = policy_scope(Integration)
    integrations = integrations.where(type: params[:type_eq]) if params[:type_eq]
    render_resources integrations,ransack_query: params[:q]
  end
end

api/integrations 响应是:

[{"id":254,"name":"Integration 1"...

结果中不包含任何 resources 键。我在下面描述了 render_resources 方法

def render_resources(resources,options = {})
    options[:pagination] = true if options[:pagination].nil?
    pagination = options.delete(:pagination)
    ransack_query = options.delete(:ransack_query) || {}
    ransack_sort = options.delete(:ransack_sort) || params[:sort]

    resources = resources.ransack(ransack_query.to_hash.merge(s: ransack_sort)).result if ransack_sort || ransack_query.any?

    total = resources.respond_to?(:total_count) ? resources.total_count : resources.length
    default = {root: :resources,Meta: {total: total}}
    results = pagination ? resources.page(params[:page]).per(params[:per_page]) : resources
    results = results.includes(options[:includes]) if options[:includes]
    render({json: results}.merge(default).merge(options))
  end

由于此方法不再返回包含 resources 键的响应,我是否可以说这是因为隐含的库 - Ransack 和 Pagination?因为在我更新 ruby​​ 和 rails gems 之前,该功能按预期工作。不过,我不知道应该在 resourcesresource 键中构造响应的 JSON 数据的库是什么。

解决方法

这很可能是由于您在控制器/后端中的代码造成的。在第一个示例中,活动记录被格式化为 JSON 的散列,而在第二个示例中,它是活动记录关系。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?