所以我有一个EmberJS和Rails API。
我正在使用Active Model Serializer。
我有以下Active Model Serializer intializer配置:
ActiveModelSerializers.config.adapter = :json_api
api_mime_types = %W(
application/vnd.api+json
text/x-json
application/json
)
Mime::Type.register 'application/vnd.api+json', :json, api_mime_types
目前,我的Ember应用程序能够从我的Rails API中获取数据。
然而,将更新的用户信息发送到我的Rails服务器时遇到了问题。
我在Rails服务器日志中收到错误:
Unpermitted parameters: data, id, user
我的余烬似乎在发送参数:
{
"data"=>{
"id"=>"2",
"attributes"=>{
"first-name"=>"James",
"last-name"=>"Raynor",
"username"=>"Jimobo",
"email"=>"jim@gmail.com",
"photo"=>{
"photo"=>{
"url"=>nil
}
}
},
"type"=>"users"
},
"id"=>"2",
"user"=>{
}
}
注意:我只是将用户名从Jimo
更改为Jimobo
。
当我构建我的Rails API时,我使用的是Active Model Serializer,强参数类似于:
def user_params
params.permit(:first_name, :last_name, :username, :email, :password, :password_confirmation, :photo, friend_ids: [])
end
我是否真的必须完成每个强大的参数声明并将其修改为:
params.require(:data).require(:attributes).permit(...);
或者是否有一些神奇的解决方案我做得不正确?
在这次Github讨论https://github.com/rails-api/active_model_serializers/issues/1027#issuecomment-126543577中,名为 rmcsharry 的用户提到他并不需要修改任何内容,而且它开箱即用......虽然他没有表明他的强大参数是什么样的。
答案 0 :(得分:0)
我想我终于明白了:D
记录这是为了我未来的自我。
ActiveModelSerializers.config.adapter = :json_api
ActiveModelSerializers.config.key_transform = :unaltered
# Be sure to restart your server when you modify this file.
# Add new mime types for use in respond_to blocks:
Mime::Type.register "text/richtext", :rtf
api_mime_types = %W(
application/vnd.api+json
text/x-json
application/json
)
Mime::Type.unregister :json
Mime::Type.register 'application/json', :json, api_mime_types
// no need to include :id
params.require(:data).require(:attributes).permit(...)
我还需要按照本指南在我的Ember端生成一个序列化器:https://github.com/rails-api/active_model_serializers/blob/master/docs/integrations/ember-and-json-api.md
ember generate serializer application
import DS from 'ember-data';
import Ember from 'ember';
var underscore = Ember.String.underscore;
export default DS.JSONAPISerializer.extend({
keyForAttribute: function(attr) {
return underscore(attr);
},
keyForRelationship: function(rawKey) {
return underscore(rawKey);
}
});
有趣的是,该指南基本上告诉Ember使用下划线来表示多个单词属性,但JSON API规范使用短划线而不是下划线。因此,这些更改将使Ember和Rails感到满意,但它与我所看到的并不符合JSON API。
现在我需要返回并修复所有其他控制器和测试,以满足新的:data
和:attributes
强参数:(
我设法偶然发现了......为什么我需要这么长时间才发现它?
执行强参数的更好方法是这样的:
ActiveModelSerializers::Deserialization.jsonapi_parse(params, only: [:first_name, :last_name, :email, :password, :password_confirmation])
这样做意味着我们不需要手动指定
params.require(:data).require(:attributes)
它可能会在幕后进行,但由于它与Active Model Serializer人员的其他文章一致,我想使用AMS的反序列化方法将是推荐的方法。