强参数JSON API rails

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错误对象,这是我们想要的.


Joe*_*MAR 5

我想现在实现这一目标的最佳方法是:

添加

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)

  • 您可以传递 `only` 选项,如下所示:`ActiveModelSerializers::Deserialization.jsonapi_parse!(params, only: [:title, :content, :author])`。有关详细信息,请参阅 ams [反序列化](https://github.com/rails-api/active_model_serializers/blob/v0.10.6/docs/general/deserialization.md) 指南部分。如果需要,您甚至可以使用“ except”选项。 (2认同)