kit*_*itz 14 api rest json ruby-on-rails ruby-on-rails-4
我正在使用Rails 4.2中的REST API,我想尊重JSON API格式.我的参数是这样的:
{
"data":{
"type": "articles",
"id": "1",
"attributes": {
"title": "this is title",
"description": "This is description"
}
}
Run Code Online (Sandbox Code Playgroud)
我试着为这样强的params写一个方法:
def article_params
params.require(:data).permit(:id, attributes: [:title, :description])
end
Run Code Online (Sandbox Code Playgroud)
但当我尝试这样做时Article.update_attributes(article_params),title and description parameters not permitted[我的文章模型有标题和描述].你能帮助我吗?
max*_*max 18
处理JSONAPI参数只比处理常用的Rails参数哈希略有不同:
class ArticlesController < ApiController
before_filter :set_article, only: [:show, :edit, :update, :destroy]
# POST /api/v1/articles
def create
@article = Article.new(article_attributes)
# ...
end
# PATCH /api/v1/articles/:id
def update
@article.update(article_attributes)
# ...
end
# ...
private
def set_article
@article = Article.find(params[:id])
end
def article_attributes
params.require(:data)
.require(:attributes)
.permit(:title, :description)
end
end
Run Code Online (Sandbox Code Playgroud)
你应该注意的第一件事是我们甚至根本没有使用params[:data][:id]JSON数据中的密钥,因为ID可以从请求url(params[:id])获得.如果您遵循RESTful模式,那么您将永远不需要使用该params[:data][:id]参数.
在article_attributes我们使用嵌套调用需要,因为我们希望Rails的提高的ActionController::ParameterMissing,除非提供JSON数据证实的JSON API SPEC错误.vanilla Rails默认是使用400 Bad Request响应进行救援 - 如果为JSONAPI正确设置了RailsAPI将返回422和JSON错误对象,这是我们想要的.
我想现在实现这一目标的最佳方法是:
添加
gem 'active_model_serializers'
Run Code Online (Sandbox Code Playgroud)
到您的 Gemfile
这在你的控制器上
ActiveModelSerializers::Deserialization.jsonapi_parse(params)
Run Code Online (Sandbox Code Playgroud)
为您提供奖励手柄破折号。
params = { "data": {
"attributes": {
"title": "Bucket List",
"created-by": "John Doe"
},
"type": "todos"
}
}
params = ActionController::Parameters.new(params)
ActiveModelSerializers::Deserialization.jsonapi_parse(params)
=> {:title=>"Bucket List", :created_by=>"John Doe"}
Run Code Online (Sandbox Code Playgroud)