我在使用EsonCLI和Rails时使用Active Model Serializers 0.10.x,同时尝试将Json-Api作为适配器.GET请求正在努力,但反序列化的活动模型甚至没有,虽然我试图落实jimbeaudoin描述的轨道strong_parameters解决方案在这里.
我保存评论的最新尝试:
有效载荷:
{"data":{
"attributes": {"soft_delete":false,"soft_delete_date":null,"text":"hjfgfhjghjg","hidden":false,"empathy_level":0},
"relationships":{
"user":{"data":{"type":"users","id":"1"}},
"post":{"data":{"type":"posts","id":"1"}}},"type":"comments"}}
Run Code Online (Sandbox Code Playgroud)
控制台输出:
Completed 400 Bad Request in 13ms (ActiveRecord: 8.6ms)
ActionController::ParameterMissing (param is missing or the value is empty: data):
Run Code Online (Sandbox Code Playgroud)
评论控制器:
class Api::V1::CommentsController < MasterApiController
respond_to :json
...
def create
render json: Comment.create(comment_params)
end
...
def comment_params
#Deserialization issues... Waiting for #950 https://github.com/rails-api/active_model_serializers/pull/950
params.require(:data).require(:attributes).permit(:text, :user_id, :post_id, :empathy_level, :soft_delete_date, :soft_delete, :hidden)
end
end
Run Code Online (Sandbox Code Playgroud)
注意到如果我将参数设置为只有params.permit(...),服务器会将所有内容保存为null(我现在没有在注释模型上设置任何约束):
data: {id: "9", type: "comments",…}
attributes: {soft_delete: null, soft_delete_date: null, text: null, …Run Code Online (Sandbox Code Playgroud) 我想在API请求导致404错误时采取特定操作.我已经读过,执行此操作的适当方式是处理应用程序适配器中的错误,如下所示:
handleResponse: function(status, headers, payload){
if(status === 404 && payload.errors){
//handle error
}
return this._super(...arguments);
}
Run Code Online (Sandbox Code Playgroud)
问题是,一旦我设置了适配器,它就不会完成加载页面,所以我可以处理页面本身的错误.相反,它会自动转到一些错误路径,只是说"适配器错误".如何停止/覆盖此行为?
我正在创建一个关系博客,我用它ember_simple_auth:session来存储会话,例如
{"authenticated":{"authenticator":"authenticator:devise","token":"rh2f9iy7EjJXESAM5koQ","email":"user@example.com","userId":1}}
Run Code Online (Sandbox Code Playgroud)
但是,在 Chrome 上的开发人员工具(也可能在其他浏览器上)上,编辑电子邮件和用户 ID 以便在页面重新加载时模拟另一个用户是相当容易的。
从与 Joachim 和 Nikolaj 的交谈中,我现在意识到解决这个问题的最佳方法是在每次需要时探测 localStorage 的真实性(仅在页面重新加载时),而不是试图阻止编辑。
为了验证真实性,我创建了一个承诺,必须在使用 AccountSession 之前解决该承诺。Promise serverValidation()请求使用当前的 localStorage 信息创建一个令牌模型,当服务器获取它时,它会验证该信息,并在信息合法时使用类型为 token 的简单用户序列化响应 200。您可以在源代码上查看更多信息。
会话帐户
import Ember from 'ember';
const { inject: { service }, RSVP } = Ember;
export default Ember.Service.extend ({
session: service('session'),
store: service(),
serverValidation: false,
// Create a Promise to handle a server request that validates the current LocalStorage
// If valid, then set SessionAccount User.
loadCurrentUser() {
if (!Ember.isEmpty(this.get('session.data.authenticated.userId'))) { …Run Code Online (Sandbox Code Playgroud)