Emberjs PATCH 和 POST 到 Rails 不允许的参数
Emberjs PATCH and POST to Rails unpermitted parameters
所以我有一个 EmberJS 和 Rails API。
我正在使用活动模型序列化程序。
我有以下活动模型序列化程序初始化程序配置:
active_model_serializer.rb
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
我的 ember 似乎正在发送参数:
{
"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 的用户提到他并不真的需要修改任何东西而且它开箱即用......虽然他并没有表现出自己强大的参数长什么样
我想我终于成功了:D
为未来的自己记录下来。
config/initializers/active_model_serializer.rb
ActiveModelSerializers.config.adapter = :json_api
ActiveModelSerializers.config.key_transform = :unaltered
config/initializers/mime_types.rb
# 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
app/serializer/application.js
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 的反序列化方法。
所以我有一个 EmberJS 和 Rails API。
我正在使用活动模型序列化程序。
我有以下活动模型序列化程序初始化程序配置:
active_model_serializer.rb
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
我的 ember 似乎正在发送参数:
{
"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 的用户提到他并不真的需要修改任何东西而且它开箱即用......虽然他并没有表现出自己强大的参数长什么样
我想我终于成功了:D
为未来的自己记录下来。
config/initializers/active_model_serializer.rb
ActiveModelSerializers.config.adapter = :json_api
ActiveModelSerializers.config.key_transform = :unaltered
config/initializers/mime_types.rb
# 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
app/serializer/application.js
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 的反序列化方法。