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 强参数:(

更新

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

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 的反序列化方法。