EmberJS 2.7,Rails 5,AMS 0.10.2 - GET 资源集合,其中 fieldX=[B 或 C]
EmberJS 2.7, Rails 5, AMS 0.10.2 - GET resources collection where fieldX=[B or C]
我有一个像这样的 EmberJS 过滤器:
/app/routes/trails/new.js
model: function (filterCurrentEmployees) {
return Ember.RSVP.hash({
trail: this.store.createRecord('trail'),
employees: this.store.query('employee', { status: '1,2'}).then(
function(data) {return data})
})
},
我希望 status: '1,2'
最终会成为一个普通的 Rails 参数,这样我就可以执行 params[:status] 然后过滤返回的员工(你知道这样数据库会得到一个像 'where status IN ['1','2']'
)
这样的查询
但是当这个过滤器查询被发送到 Rails API 我得到这个错误:
ActiveModelSerializers::Adapter::JsonApi::Deserialization::InvalidDocument (Invalid payload ({:data=>"Expected hash"}): {"status"=>"1,2", "controller"=>"employees", "action"=>"index"}):
在控制器中发生:
api/app/controllers/employees.rb
def employee_params
ActiveModelSerializers::Deserialization.jsonapi_parse!(params)
end
但这是 AMS 与 Ember 一起工作所必需的。
所以我认为我 sending/creating EmberJS 中的查询方式有问题?
似乎正在尝试发出 GET 收集请求。不确定,this 解释了在 Rails 端发生的事情,但我不知道如何让 Ember 正确创建过滤器,以便 AMS 满意接受它。
编辑 - JSON-API 规范参考
我的印象是 AMS 和 Ember 2.7 与 JSON-API 'just work out of the box'。我实际上期望 Ember 过滤器符合 the spec 和发送
/employees?filter=status[1,2]
但它似乎并没有这样做。 AMS 说同样的话 here.
更新
因此,根据评论中的一些指示(谢谢),我了解到查询哈希的结构可能不正确。我还尝试将 'query' 更改为 filter
,但这会引发实际的 Ember 错误:
过滤器 API 已移至插件。要使用环境标志启用 store.filter,或使用替代方案,您可以访问 ember-data-filter 插件页面。
现在我不知道 Ember 查询和 Ember 过滤器之间有什么区别,也许过滤器只在客户端运行?谁知道,docs are so sparse 以及关于此的许多问题都已有 1 或 2 年历史了。
因此,在对 Ember Gold Nuggets 进行了大量挖掘之后,我发现控制器仍然需要用于...您猜对了...查询参数。
我从未使用过控制器,我认为我从来不需要它。
看来我是基于过时的信息和代码示例尝试使用查询参数。
另外,Javascript JSON-API 规范中的对象参数在 Ember 中似乎还不支持,根据 ,虽然它已经快一年了所以不知道这是否仍然如此。
更新
所以,在进一步淘金之后,我似乎很困惑,客户端 Ember 中的查询参数需要控制器,以在前端应用程序从一个路由转换到另一个路由时协助它(那就是你需要一个控制器来设置它们的时候。
但我只想从路由代码中直接向 API 发送一个查询参数,很难找到这样做的例子。
所以在 Rails 日志中,我希望在 ASM 反序列化之前看到:
Rails.logger.info "Params are: #{params.to_json}"
像这样:
Params are:
{"data":{"filter":{"status["1,2"]}},
"controller":"employees","action":"index"}
ASM 期望 'data' 成为散列的根元素,然后我可以在其中放置过滤器。例如,来自 Ember 路线:
model: function () {
let myFilter = {};
myFilter.data = { filter: {status: ['1,2']}};
return Ember.RSVP.hash({
trail: this.store.createRecord('trail'),
employees: this.store.query('employee', myFilter).then(function(data) {return data})
})
},
我有一个像这样的 EmberJS 过滤器:
/app/routes/trails/new.js
model: function (filterCurrentEmployees) {
return Ember.RSVP.hash({
trail: this.store.createRecord('trail'),
employees: this.store.query('employee', { status: '1,2'}).then(
function(data) {return data})
})
},
我希望 status: '1,2'
最终会成为一个普通的 Rails 参数,这样我就可以执行 params[:status] 然后过滤返回的员工(你知道这样数据库会得到一个像 'where status IN ['1','2']'
)
但是当这个过滤器查询被发送到 Rails API 我得到这个错误:
ActiveModelSerializers::Adapter::JsonApi::Deserialization::InvalidDocument (Invalid payload ({:data=>"Expected hash"}): {"status"=>"1,2", "controller"=>"employees", "action"=>"index"}):
在控制器中发生:
api/app/controllers/employees.rb
def employee_params
ActiveModelSerializers::Deserialization.jsonapi_parse!(params)
end
但这是 AMS 与 Ember 一起工作所必需的。
所以我认为我 sending/creating EmberJS 中的查询方式有问题?
似乎正在尝试发出 GET 收集请求。不确定,this 解释了在 Rails 端发生的事情,但我不知道如何让 Ember 正确创建过滤器,以便 AMS 满意接受它。
编辑 - JSON-API 规范参考
我的印象是 AMS 和 Ember 2.7 与 JSON-API 'just work out of the box'。我实际上期望 Ember 过滤器符合 the spec 和发送
/employees?filter=status[1,2]
但它似乎并没有这样做。 AMS 说同样的话 here.
更新
因此,根据评论中的一些指示(谢谢),我了解到查询哈希的结构可能不正确。我还尝试将 'query' 更改为 filter
,但这会引发实际的 Ember 错误:
过滤器 API 已移至插件。要使用环境标志启用 store.filter,或使用替代方案,您可以访问 ember-data-filter 插件页面。
现在我不知道 Ember 查询和 Ember 过滤器之间有什么区别,也许过滤器只在客户端运行?谁知道,docs are so sparse 以及关于此的许多问题都已有 1 或 2 年历史了。
因此,在对 Ember Gold Nuggets 进行了大量挖掘之后,我发现控制器仍然需要用于...您猜对了...查询参数。
我从未使用过控制器,我认为我从来不需要它。
看来我是基于过时的信息和代码示例尝试使用查询参数。
另外,Javascript JSON-API 规范中的对象参数在 Ember 中似乎还不支持,根据
更新
所以,在进一步淘金之后,我似乎很困惑,客户端 Ember 中的查询参数需要控制器,以在前端应用程序从一个路由转换到另一个路由时协助它(那就是你需要一个控制器来设置它们的时候。
但我只想从路由代码中直接向 API 发送一个查询参数,很难找到这样做的例子。
所以在 Rails 日志中,我希望在 ASM 反序列化之前看到:
Rails.logger.info "Params are: #{params.to_json}"
像这样:
Params are:
{"data":{"filter":{"status["1,2"]}},
"controller":"employees","action":"index"}
ASM 期望 'data' 成为散列的根元素,然后我可以在其中放置过滤器。例如,来自 Ember 路线:
model: function () {
let myFilter = {};
myFilter.data = { filter: {status: ['1,2']}};
return Ember.RSVP.hash({
trail: this.store.createRecord('trail'),
employees: this.store.query('employee', myFilter).then(function(data) {return data})
})
},