web-dev-qa-db-ja.com

Rails強力なパラメーターを使用したJson-Apiの逆シリアル化

Json-Apiをアダプターとして使用しようとしているときにEmberCLIとRails)でアクティブモデルシリアライザー0.10.xを使用しています。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(...)のみに設定した場合、サーバーはすべて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"

あなたは完全なコードにアクセスすることができます ここ

22
Deovandski

アップデート#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

12
Deovandski

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

8
rolkos

AMS 0.10.2+の場合

onlyハッシュを使用して、パラメータのホワイトリストを作成します。

def post_params
  ActiveModelSerializers::Deserialization.jsonapi_parse!(
    params, only: [:title, :author, :tags]
  )
end
7

グーグルの場合:

空のデータペイロードがある場合は、Mimeサポートを追加する必要があります https://stackoverflow.com/a/32013294/2664779

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
3
qnsi