Emberjs PATCH и POST для недопустимых параметров Rails

Итак, у меня есть EmberJS и Rails API.

Я использую Active Model Serializer.

У меня есть следующая конфигурация инициализатора Active Model Serializer:

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 может нормально извлекать данные из моего API Rails.

Однако у него возникают проблемы с отправкой обновленной информации о пользователе на мой сервер Rails.

Я получаю сообщение об ошибке в журнале сервера Rails:

Unpermitted parameters: data, id, user

Мой Ember, кажется, отправляет параметры:

{
    "data"=>{
        "id"=>"2",
        "attributes"=>{
            "first-name"=>"James",
            "last-name"=>"Raynor",
            "username"=>"Jimobo",
            "email"=>"[email protected]",
            "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)


Кажется, у меня наконец-то получилось :D

Документирую это для себя в будущем.

config/initializers/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.

person Zhang    schedule 07.12.2016