2017-04-09 1 views
1

J'utilise Rails comme serveur API, et je me demande pourquoi les données envoyées au serveur doivent être imbriquées. Cela semble être le meilleur moyen de définir params:Pourquoi les données POST doivent-elles être imbriquées?

def user_params 
    params.require(:user).permit(:first_name, :last_name, :password, :username, :email) 
end 

Et ce serait le JSON correspondant envoyé à la create route:

{ 
    "user": { 
     "username": "lorem", 
     "first_name": "ipsum", 
     "last_name": "dolor", 
     "password": "sit", 
     "email": "amet" 
    } 
} 

Pourquoi est-ce le meilleur moyen de données affichage? Pourquoi ne pouvait-JSON être:

{ 
    "username": "lorem", 
    "first_name": "ipsum", 
    "last_name": "dolor", 
    "password": "sit", 
    "email": "amet" 
} 
+0

Aucune expérience avec RoR ici, mais pour moi cela semble dû au fait que vous avez réellement besoin d'un paramètre 'user' qui contient les autres champs? – Mario

+0

Oui c'est! Mais c'est de cette façon que les rails sont utilisés pour le contrôleur. Je comprends qu'il devrait y avoir une raison de le faire dans le code généré automatiquement et j'aime savoir quelle est la raison. – theva

Répondre

5

Ce ne sont pas les seuls paramètres qui sont envoyés tout en créant une ressource pour vous, d'autres sont:

  1. utf8 avec la valeur
  2. authenticity_token avec chaîne aléatoire
  3. commit avec valeur soit Save ou Update

La logique est donc évidente: Rails regroupe tous les paramètres appartenant à l'utilisateur dans la clé user, ce qui facilite sa lecture, facilite l'interprétation par le code et facilite la mise en liste blanche des paramètres associés. Non seulement cela, parfois vous allez essayer de créer plusieurs ressources à travers une demande, comme un utilisateur a beaucoup de livres, de sorte que vous souhaitez créer un utilisateur, et en même temps, des livres - quelque chose appelé Nested Resources, et en dans ce cas, ce sera comme ceci:

{ 
    "user": 
    { 
    "username": "john_don", 
    "books": 
    { 
     "0": 
     { 
     "author_id": 1 
     } 
    } 
    } 
} 

J'espère que vous aurez l'idée.