使用 Rails 强参数反序列化 Json-Api
Deserializing Json-Api with Rails Strong Parameters
我正在使用 Active Model Serializers 0.10.x 与 EmberCLI 和 Rails,同时尝试将 Json-Api 作为适配器。 GET 请求正在运行,但活动模型的反序列化没有运行,即使我尝试实施 jimbeaudoin here.
描述的 rails strong_parameters 解决方案
我最近一次保存评论的尝试:
有效负载:
{"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(...),服务器会将其保存为空(我没有设置任何限制现在的评论模型):
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"
您可以访问完整代码 here。
对于谷歌员工:
如果您的数据负载为空,则需要添加 Mime 支持
当你想访问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
更新 #2:对于 AMS >= 0.10.2,请检查其他答案。
更新 #1:答案对 AMS 仍然有效 0.10.1。
如果您使用 0.10.0.rc4,您现在可以使用 Active Model Serializers #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 数据,那么你可以在我的 Fakktion Github repo.
上看到一个示例实现
对于 AMS >= 0.10.2
在 0.10.2 中进行了清理,因此在 0.10.2 之后使用:
def post_params
ActiveModelSerializers::Deserialization.jsonapi_parse(params)
end
使用 AMS 0.10.2+
使用only
哈希创建参数白名单,
def post_params
ActiveModelSerializers::Deserialization.jsonapi_parse!(
params, only: [:title, :author, :tags]
)
end
我正在使用 Active Model Serializers 0.10.x 与 EmberCLI 和 Rails,同时尝试将 Json-Api 作为适配器。 GET 请求正在运行,但活动模型的反序列化没有运行,即使我尝试实施 jimbeaudoin here.
描述的 rails strong_parameters 解决方案我最近一次保存评论的尝试:
有效负载:
{"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(...),服务器会将其保存为空(我没有设置任何限制现在的评论模型):
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"
您可以访问完整代码 here。
对于谷歌员工:
如果您的数据负载为空,则需要添加 Mime 支持
当你想访问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
更新 #2:对于 AMS >= 0.10.2,请检查其他答案。
更新 #1:答案对 AMS 仍然有效 0.10.1。
如果您使用 0.10.0.rc4,您现在可以使用 Active Model Serializers #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 数据,那么你可以在我的 Fakktion Github repo.
上看到一个示例实现对于 AMS >= 0.10.2
在 0.10.2 中进行了清理,因此在 0.10.2 之后使用:
def post_params
ActiveModelSerializers::Deserialization.jsonapi_parse(params)
end
使用 AMS 0.10.2+
使用only
哈希创建参数白名单,
def post_params
ActiveModelSerializers::Deserialization.jsonapi_parse!(
params, only: [:title, :author, :tags]
)
end