0

先日、新しいrails 5 --api --database = postgresqlアプリケーションを生成し、足場(Hero)を1つ作成しました。Rails 5 API Strong Parametersの振る舞い

def create 
    hero = Hero.new(hero_params) 

    if hero.save 
    render json: hero, status: :created, location: hero 
    else 
    render json: hero.errors, status: :unprocessable_entity 
    end 
end 

マイhero_paramsは次のようになります。:

コントローラは次のようになります。

def hero_params 
    params.require(:hero).permit(:name) 
end 

をだから私は希望私はいくつかの奇妙な行動を見ていて、強力なパラメータは、レールにどのように動作するか私は思ったんだけどクライアントが"hero"キーを含むハッシュを提出する必要があり、このコントローラアクションが呼び出されたときに一括割り当てが許可される"name "サブキーを持つことが許可されているとします。

意味、JSONは次のようになります。

{ 
    "hero": { 
    "name": "test" 
    } 
} 

すべてが順調ですが、ここで私は奇妙な行動を見ていところです。ユーザーは単に送信する場合今

Parameters: {"hero"=>{"name"=>"test"}} 

{ "name": "test" } 

それはまだ新しいリソースを作成し、パラメータとしてでてくるユーザーは、上記のように正確なJSONを送信すると、パラメータがようで来ます:パラメータの二組、実際の送信されたデータとの一方とのフォーマットの一つがある理由

Parameters: {"name"=>"test", "hero"=>{"name"=>"test"}} 
  1. あたかもマス課題を予期していたかのように主人公を狙っている?

  2. require(:hero)は、キーが送信されないとエラーを発生させません。私はこの答えがあるため、自動的に、これは必要最小限のレールの動作ですように、第2のハッシュ("hero"=>{"name"=>"test"}}

  3. 1.質問から

は、私がここで行方不明です何上の任意の情報を大幅に、理解されるであろうと作成されたものであると仮定しOUT- 。の-ボックス

+0

ユーザーが両方のパラメータを送信したようです。 '{name:" test "、英雄:{name:"テスト "}}'。これは可能ですか? – messanjah

+0

いいえ、私はユーザーであり、私はPOSTMANを通じて要求を送信しています。両方の例が別々に送られました。 –

答えて

1

この動作はActionController::ParamsWrapperから来ている:

ラップパラメータは、ネストされたハッシュにハッシュこれは、クライアントが任意のルート要素を指定せずに要求を提出することができます

Railsアプリケーションでは、JSONリクエストのデフォルトでパラメータラッピングが有効になっています。 config/initializers/wrap_parameters.rbを編集するか、コントローラーにwrap_parameters falseを組み込んで個々のコントローラーを編集して、グローバルに無効にすることができます。