2016-06-11 3 views
0

Ich arbeite an einer API-only Rails 5 App - ja, ich weiß. Ich war eine Weile nicht in der Nähe von Rails, also machte ich etwas überfälliges Nachholen, als ich auf den guten, verschachtelten Hash der Parameter stieß, den ich völlig vergessen hatte. Sagen wir, ich will eine User schaffen, ich dachte, dass ich mit den folgenden Parametern eine POST-Anforderung ausgeben würde (wir es JSON der Einfachheit halber machen):Format der params Struktur von Rails erwartet 5

{ "username": "myUsername", "password": "myPassword" } 

Doch nach viel Trauer und googeln, entdeckte ich/erinnerte sich, dass ich soll folgendes passieren:

{ "user": { "username": "myUsername", "password": "myPassword" } } 

die wiederum macht die folgende

def user_params 
    params.request(:user).permit(:username, :password) 
end 

glücklich.

Alles in allem bin ich damit einverstanden. Dies wird eine private API für eine mobile App sein, und ich erwarte nicht, sie für irgendjemanden zu öffnen. Ich habe jedoch andere (typischerweise erholsame ish-ähnliche) APIs im Internet gelesen und keine von ihnen hat das verschachtelte model-Geschäft. Ich werde bald an einer öffentlichen API für ein anderes Projekt arbeiten, also habe ich mich gefragt, ob es einen bestimmten Grund gibt, diese Struktur zu verlangen, und wenn nicht, wie kann ich starke Parameter ohne die ganze Verschachtelung beibehalten.

Antwort

0

Es ist im Allgemeinen bequem für params[:user], auf alle Parameter für einen Benutzer und ohne das Risiko der Zusammenstöße mit magischen Parametern wie Controller, Aktion, Format und so weiter zu verweisen.

Sie können parameter wrapping verwenden, um diese für API-Clients leicht zu machen

Wenn Sie

wrap_parameters format: [:json] 

Um Ihren Controller fügen Sie dann für JSON fordert Schienen werden Parameter wickeln, die Benutzer entsprechen in einer Hash-Attribute (wenn Ihr Controller heißt nicht UsersController Sie müssen dem Action Controller die zu verwendende Klasse oder die Parameter mitteilen, die umgebrochen werden sollen. Dadurch kann der Controller-Code unverändert bleiben, aber API-Clients können "nackte" Parameter posten.

Sie können dies auch global für die gesamte Anwendung aktivieren.

+0

Das bedeutet, ich kann 'user_params()' immer noch so verwenden und alle Vorteile und starken Parameter beibehalten, oder? – Morpheu5

+1

Das ist richtig. –