Дессериализация Json-Api с рельсами Сильные параметры
Я использую Active Serializers 0.10.x с EmberCLI и Rails, пытаясь использовать Json-Api в качестве адаптера. Запросы GET работают, но десериализация для активной модели даже не пыталась реализовать решение rails strong_parameters, описанное jimbeaudoin здесь.
Моя последняя попытка сохранить комментарий:
Полезная нагрузка:
{"data":{
"attributes": {"soft_delete":false,"soft_delete_date":null,"text":"hjfgfhjghjg","hidden":false,"empathy_level":0},
"relationships":{
"user":{"data":{"type":"users","id":"1"}},
"post":{"data":{"type":"posts","id":"1"}}},"type":"comments"}}
Консольный выход:
Completed 400 Bad Request in 13ms (ActiveRecord: 8.6ms)
ActionController::ParameterMissing (param is missing or the value is empty: data):
Контроллер комментариев:
class Api::V1::CommentsController < MasterApiController
respond_to :json
...
def create
render json: Comment.create(comment_params)
end
...
def comment_params
#Deserialization issues... Waiting for #950 https://github.com/rails-api/active_model_serializers/pull/950
params.require(:data).require(:attributes).permit(:text, :user_id, :post_id, :empathy_level, :soft_delete_date, :soft_delete, :hidden)
end
end
Отметив, что если я установил параметры только params.permit(...), сервер сохранит его со всем значением null (я не задавал никаких ограничений для модели комментариев на данный момент):
data: {id: "9", type: "comments",…}
attributes: {soft_delete: null, soft_delete_date: null, text: null, hidden: null, empathy_level: null}
id: "9"
relationships: {post: {data: null}, user: {data: null}}
type: "comments"
Здесь вы можете получить полный код здесь.
Ответы
Ответ 1
Обновление # 2: для AMS >= 0.10.2, пожалуйста, проверьте другие ответы.
Обновление # 1: Ответ по-прежнему действителен для AMS 0.10.1.
Если вы используете 0.10.0.rc4, теперь вы можете использовать реализацию десериализации, описанную в разделе "Сериализаторы активной модели" # 1248.
def post_params
ActiveModel::Serializer::Adapter::JsonApi::Deserialization.parse(params.to_h)
// or (params.to_unsafe_h) in some cases like in my example below...
end
Бонус: Если вы используете Ember Data, вы можете увидеть пример реализации на моем Fakktion Github repo.
Ответ 2
Для AMS >= 0.10.2
В 0.10.2 произошла очистка, поэтому после 0.10.2 используйте:
def post_params
ActiveModelSerializers::Deserialization.jsonapi_parse(params)
end
Ссылка:
https://github.com/rails-api/active_model_serializers/commit/252f9c4ae932e6280dfe68605d495b208fe22ba7
Ответ 3
С AMS 0.10.2 +
Использовать хеш only
для создания белого списка параметров,
def post_params
ActiveModelSerializers::Deserialization.jsonapi_parse!(
params, only: [:title, :author, :tags]
)
end
Ответ 4
Для гуглеров:
Если у вас пустая информационная нагрузка, вам нужно добавить поддержку Mime
fooobar.com/info/294966/...
Когда вы хотите получить доступ к json-api, отформатированному json, вы должны сделать это так:
(в вашем контроллере)
def create
user = User.new(user_params)
...
end
private
def user_params
params.require(:data).require(:attributes).permit(:email, :password)
end
Если раньше я делал это так,
private
def user_params
params.require(:user).permit(:email, :password)
end