很长一段时间的Java开发人员 - ror的新手 - 我在Rails 4中构建了一个JSON REST API,我遇到了使用强参数的问题.当我对我的一个端点执行HTTP POST请求时,我希望我的控制器需要主对象,需要它的一些属性,如果存在某些其他属性,它也会返回它们.看到那些需要和允许方法返回哈希,我想知道什么是允许和要求同一对象的某些属性的最佳实践.我应该合并两个哈希吗?非常感谢您的投入,因为我花了很多时间研究这个问题.
我目前正在为Rails实现一个JSON API,以便为Android移动应用提供服务,这需要进行Google身份验证.
我希望的流程是Google API OAuth2的一次性代码流(混合身份验证),如omniauth-google-oauth gem中所述.简而言之,Android应用从Google帐户的服务器获取一次性代码并将其交给Rails API操作,该操作将其转换为访问令牌,然后使用它来获取用户的个人资料信息.
考虑到这一点,我有两个关于Rails中的Devise omniauth实现的问题:
我发现在omniauth-google-oauth gem的文档中已经描述了Javascript的一次性代码客户端流程实现.但是,Devise通过将用户重定向到新的注册页面来处理授权失败,并且回调阶段需要一组我没有文档的参数.Devise是否支持JSON API的此类流程?如果是这样,应该如何处理?
我注意到有一种触发器可以启动omniauth的回调阶段,如下所示.问题是,当我将omniauth的path_prefix更改为/ users/auth /的其他内容时,当我对回调URL发出POST请求时,不会触发此操作.Devise/Omniauth使用什么标准来触发此触发器?
INFO - omniauth :( google_oauth2)已启动回调阶段.
作为参考,我使用Rails 4.1.6与Ruby 2.1.3和Devise 3.2.4.
我非常感谢你的帮助!
我正在尝试使用Swagger 2.0为端点创建示例响应.
200:
description: Successful response
schema:
type: object
$ref: "#/definitions/User"
examples:
application/vnd.api+json:
- data:
attributes:
full_name: John Appleseed
- data:
attributes:
full_name: Mike Appleseed
Run Code Online (Sandbox Code Playgroud)
我的api消耗和产生application/vnd.api+json,但它不会识别它.如果我删除这些示例,我的规范就可以了.知道如何指定吗?

关于JSON API响应键"类型"与Ember模型名称匹配的快速问题.
如果我有一个模型,说"models/photo.js",我有一个像"/ photos"的路线,我的JSON API响应看起来像这样
{
data: [{
id: "298486374",
type: "photos",
attributes: {
name: "photo_name_1.png",
description: "A photo!"
}
},{
id: "298434523",
type: "photos",
attributes: {
name: "photo_name_2.png",
description: "Another photo!"
}
}]
}
Run Code Online (Sandbox Code Playgroud)
我假设我的模型名称应该是单数但是会弹出这个错误
Assertion Failed: You tried to push data with a type 'photos' but no model could be found with that name
Run Code Online (Sandbox Code Playgroud)
当然,这是因为我的模型被命名为"照片"
现在,在JSON API规范中,有一条注释"此规范与变形规则无关,因此type的值可以是复数或单数.但是,在整个实现中应始终使用相同的值."
所以,
tl; dr服务器的"Ember方式"是否具有模型名称和JSON API响应键"类型"都是单数的?或者只要匹配就没关系?
我目前正试图弄清楚如何在使用store.findRecord()呼叫时访问元数据.
在指南(http://guides.emberjs.com/v2.1.0/models/handling-metadata/)中,它表示可以通过执行以下操作来访问元数据:
store.query('post').then((result) => {
let meta = result.get('meta');
})
Run Code Online (Sandbox Code Playgroud)
我希望这会利用工作时findRecord也
store.findRecord('book', params.id, {adapterOptions: {query: params}}).then((result) => {
let meta = result.get('meta');
})
Run Code Online (Sandbox Code Playgroud)
但是,这始终为meta属性返回undefined .我假设在使用时没有设置元数据findRecord.我返回有效的JSON-API meta,其顶级属性如下:
{
"meta": {
"page": {
"number": 1,
"size": 100,
"total": 20
},
"data":[
// data here
]
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在使用findRecord()和JSONAPISerializer和JSONAPIAdapters时访问服务器返回的元数据?
谢谢!
我使用以下版本:
Ember : 2.1.0
Ember Data : 2.1.0
jQuery : 1.11.3
Run Code Online (Sandbox Code Playgroud) 我有一个示例json:
{
"type": "persons",
"id": 2,
"attributes": {
"first": "something",
"second": "something else"
}
}
Run Code Online (Sandbox Code Playgroud)
我必须为它制作一个模式(使用JSON API规范和JSON模式文档):
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"type": {
"type": "string",
"pattern": "^persons$"
},
"id": {
"type": "integer"
},
"attributes": {
"type": "object",
"properties": {...}
}
},
"required": ["type", "id", "attributes"]
}
Run Code Online (Sandbox Code Playgroud)
问题是:如果"类型"唯一可接受的值是"人",我应该使用模式模式(如上所述)还是枚举类似
"enum": ["persons"]
Run Code Online (Sandbox Code Playgroud)
我无法从文档中得到任何明确的答案,尽管在规范枚举中的示例用于单个值.你有什么看法?
我正在开发一个使用 Ember Data 和现在默认的 json-api 适配器的 Ember 应用程序。
根据 json-api 规范 ( http://jsonapi.org/format/#crud-deleting ),删除记录时,200如果删除成功,服务器应返回响应,并且服务器仅使用顶级meta密钥进行响应。
我当前的服务器就是这样做的,我试图弄清楚在使用 Ember Data 的model.destroyRecord()方法时如何访问顶级元对象中的数据。
myModel.destroyRecord().then(function(model){
// the returned value is the model. How can I get the actual metadata
// returned by the server?
});
Run Code Online (Sandbox Code Playgroud)
服务器响应包含有关确切删除内容的信息,如下所示:
{
"meta": {
num-deleted-a: 10,
num-deleted-b: 100,
num-deleted-c: 200
}
}
Run Code Online (Sandbox Code Playgroud)
我想获取此信息,以便将其显示给用户。
谢谢!
我正在使用以下版本:
Ember : 2.2.0
Ember Data : 2.3.3
jQuery : 1.11.3
Run Code Online (Sandbox Code Playgroud) 这是我PostTransformer加入关系的地方
public function includeComments(Post $post)
{
if (($post->is_paid == 1 && $post->haspaid == 1) || ($post->author == $this->params) || ($post->is_paid == 0)){
$comments = Comment::where('post', $post->id)
->where('is_blocked', '=', 0)
->select('id',
'text',
'author',
'post',
'created_at',
'updated_at',
'book_id',
DB::raw("if(comments.author=$this->params,'true','false') as isauthor"))
->orderBy('created_at', 'ASC')
->paginate(5);
$commentTransformer = new CommentTransformer($this->params);
$commentResource = $this->collection($comments, $commentTransformer, 'comment')->setMeta(['total'=>count($comments)]);
return $commentResource;
} elseif ($post->is_paid == 1 && $post->haspaid == 0) {
return $this->null();
}
}
Run Code Online (Sandbox Code Playgroud)
这应该与meta的评论关系产生.但这里的问题是我没有得到包含关系的meta.如果有人可以帮我解决这个问题.
我正在尝试让我的应用程序以小写的camelcase返回以进行最终的JSON API格式化.
我安装gem 'active_model_serializers'并创建了一个新的初始化程序,其中包含以下代码:
ActiveModelSerializers.config.adapter = :json_api
ActiveModelSerializers.config.key_transform = :camel_lower
Run Code Online (Sandbox Code Playgroud)
然后我有一个返回json的小API,就像所有最好的互联网应用程序一样:
class Api::V1::UsersController < API::V1::BaseController
def sky
@user = User.find_by_id(params[:user_id])
if @user
obj = {
sky: {
sectors: @user.sectors,
slots: @user.slots
}
}
render json: obj
else
raise "Unable to get Sky"
end
end
Run Code Online (Sandbox Code Playgroud)
有关API控制器继承模式的更多信息: class API::V1::BaseController < ActionController::Base
问题
在我的API响应中,事情仍然是蛇形的,我在控制台中看到了这个错误,[active_model_serializers] Rendered ActiveModel::Serializer::Null但是我的研究让我陷入了死胡同.
任何建议都会非常受欢迎.谢谢!
json-api ×10
ember-data ×3
ember.js ×3
rest ×2
api ×1
devise ×1
enums ×1
google-oauth ×1
json ×1
jsonschema ×1
laravel-5.3 ×1
omniauth ×1
openapi ×1
php ×1
ruby ×1
swagger ×1
swagger-2.0 ×1
thephpleague ×1