Per l'assegnazione di massa di valori a un modello ActiveRecord senza salvare, utilizzare i metodi assign_attributes
o attributes=
. Questi metodi sono disponibili in Rails 3 e versioni successive. Tuttavia, ci sono piccole differenze e aspetti da considerare relativi alla versione.
Entrambi i metodi seguono questo utilizzo:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
Si noti che nessuno dei due metodi eseguirà convalide o eseguirà callback; i callback e la validazione avverranno quandosave
viene chiamato.
Rotaie 3
attributes=
differisce leggermente da assign_attributes
in Rails 3. attributes=
verificherà che l'argomento passato ad esso sia un hash e ritorni immediatamente in caso contrario; assign_attributes
non ha tale controllo hash. Consultare la documentazione dell'API di assegnazione degli attributi ActiveRecord perattributes=
.
Il seguente codice non valido fallirà silenziosamente semplicemente ritornando senza impostare gli attributi:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
si comporteranno silenziosamente come se gli incarichi fossero stati eseguiti con successo, quando in realtà non lo erano.
Questo codice non valido genererà un'eccezione quando assign_attributes
tenta di stringere le chiavi hash dell'array che la racchiude:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
genererà NoMethodError
un'eccezione per stringify_keys
, indicando che il primo argomento non è un hash. L'eccezione in sé non è molto istruttiva sulla causa reale, ma il fatto che si verifichi un'eccezione è molto importante.
L'unica differenza tra questi casi è il metodo utilizzato per l'assegnazione di massa: attributes=
riesce silenziosamente e assign_attributes
genera un'eccezione per informare che si è verificato un errore.
Questi esempi possono sembrare inventati e sono in una certa misura, ma questo tipo di errore può facilmente verificarsi durante la conversione di dati da un'API o anche solo usando una serie di trasformazione dei dati e dimenticando Hash[]
i risultati del finale .map
. Mantieni alcune righe del codice 50 sopra e 3 funzioni rimosse dall'assegnazione degli attributi e hai una ricetta per il fallimento.
La lezione con Rails 3 è questa: usa sempreassign_attributes
invece diattributes=
.
Rotaie 4
In Rails 4, attributes=
è semplicemente un alias di assign_attributes
. Consultare la documentazione dell'API di assegnazione degli attributi ActiveRecord perattributes=
.
Con Rails 4, entrambi i metodi possono essere usati in modo intercambiabile. Il mancato passaggio di un hash come primo argomento comporterà un'eccezione molto utile:ArgumentError: When assigning attributes, you must pass a hash as an argument.
Validazioni
Se stai preparando degli incarichi di volo in preparazione di un save
, potresti essere interessato a convalidare anche prima del salvataggio. È possibile utilizzare i metodi valid?
e invalid?
per questo. Entrambi restituiscono valori booleani. valid?
restituisce vero se il modello non salvato supera tutte le convalide o falso in caso contrario. invalid?
è semplicemente l'inverso divalid?
valid?
può essere usato in questo modo:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
Ciò ti darà la possibilità di gestire eventuali problemi di convalida prima di chiamare save
.