Emberjs PATCH和POST到Rails未允许的参数

时间:2016-12-06 13:50:46

标签: ruby-on-rails ember.js strong-parameters active-model-serializers json-api

所以我有一个EmberJS和Rails API。

我正在使用Active Model Serializer。

我有以下Active Model Serializer intializer配置:

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

我的余烬似乎在发送参数:

{
    "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 的用户提到他并不需要修改任何内容,而且它开箱即用......虽然他没有表明他的强大参数是什么样的。

1 个答案:

答案 0 :(得分:0)

我想我终于明白了:D

记录这是为了我未来的自我。

配置/初始化/ active_model_serializer.rb

ActiveModelSerializers.config.adapter = :json_api

ActiveModelSerializers.config.key_transform = :unaltered

配置/初始化/ 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

应用程序/串行器/ 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强参数:(

更新

我设法偶然发现了......为什么我需要这么长时间才发现它?

http://kyleshevlin.com/all-the-steps-needed-to-get-active-model-serializers-to-work-with-jsonapiadapter-and-jsonapiserializer-in-ember/

执行强参数的更好方法是这样的:

ActiveModelSerializers::Deserialization.jsonapi_parse(params, only: [:first_name, :last_name, :email, :password, :password_confirmation])

这样做意味着我们不需要手动指定

params.require(:data).require(:attributes)

它可能会在幕后进行,但由于它与Active Model Serializer人员的其他文章一致,我想使用AMS的反序列化方法将是推荐的方法。