Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails API路由资源错误响应_Ruby On Rails_Ruby_Rubygems_Ruby On Rails 5_Ruby On Rails 5.2 - Fatal编程技术网

Ruby on rails Rails API路由资源错误响应

Ruby on rails Rails API路由资源错误响应,ruby-on-rails,ruby,rubygems,ruby-on-rails-5,ruby-on-rails-5.2,Ruby On Rails,Ruby,Rubygems,Ruby On Rails 5,Ruby On Rails 5.2,我有一个运行在Ruby2.6.6上的RubyonRails5.2.4。前端希望后端返回的数据是JSON结构的:“资源”(如果有数据列表)或“资源”(如果只有一个数据) 该应用程序是为Rails 5.0创建的,我做了一些更新,因此它也可以在Rails 5.2上正常工作。也许我错过了什么 routes.rb看起来像: resources :route_a, only: [:index, :show] resources :route_b, only: [:index] resources :rout

我有一个运行在Ruby2.6.6上的RubyonRails5.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框架希望返回的数据包含“resources”或“resource”键。但在80%的情况下,数据不会返回资源/资源结构的JSON。Rails有什么问题?这个问题是否与gem、数据库有关?为什么对于某些路由,响应以资源/资源结构化数据的形式返回,而对于其他路由,则返回纯JSON

响应的安装,例如:

[{"id":33,"type":"M..
我需要:

[{"resources":{"id":33,"type":"M...
我是Rails新手,很抱歉可能会问一些基本的问题,但我不知道这里有什么问题。多谢各位

重要

我有一个文件:
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
重要2

这是
/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
结果中不包含任何
资源
键。我在下面描述了
render\u 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
键的响应,那么我是否可以说这是因为隐含的库——搜索和分页?因为在我更新ruby和rails gems之前,功能都是按预期工作的。不过,我不知道应该用
resources
resource
键来构造响应的JSON数据的库是什么。

如果直接从rails 5.0升级到5.2,可能会跳过修复5.1中出现的一些弃用警告。ruby升级的情况也一样——除非您有大量的测试覆盖率,而且一切都正常——最好一次只升级一个次要(5.0->5.1->5.2)版本

在rails升级期间,其他gem也会升级,每个gem的新版本可能会有一些突破性的变化(或新的bug)


如果您使用的是活动的_model _序列化程序-您可能会受到它们对默认适配器(
json_api
)的更改以及围绕
选项的其他移动的影响,请参阅和以前的更改日志,具体取决于您从哪个版本升级

我怀疑您使用的是ActionModelSerializer或类似的东西,并且更新中发生了一些更改。我建议检查资源的结构是否已更改(例如,新的/缺少的密钥)。除此之外,请尝试将
render_resource
的最后一行更改为
render{json:{resources:results,meta:{total:total}}}。合并(选项)
。我会检查。谢谢你的建议!此外,将gems的版本锁定到5.0版本,并尝试先将Rails升级到5.1,然后依次升级每个gem,这可能会有回报。我相信我犯了从5.0升级到5.2.4.2(最新版本)的错误。正如您在回复中指出的那样,我将检查0.10的变更日志。非常感谢!Rails不遵循标准SemVer。补丁级别的更新需要一些工作。
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