¿Qué está haciendo `params.require (: person) .permit (: name,: age)` en Rails 4?

149

Todos los ejemplos de parámetros fuertes en Rails 4 docs usan

params.require(:person).permit(:name, :age)

¿Podría alguien deconstruir y explicar qué está ocurriendo con requirey permitaquí?

Erik Trautman
fuente
3
Este ejemplo proviene directamente de la documentación, que explica permitpero no require.
Erik Trautman

Respuestas:

202

El paramsen un controlador se ve como un Hash, pero en realidad es una instancia de ActionController::Parameters, que proporciona varios métodos como requirey permit.

El requiremétodo garantiza que esté presente un parámetro específico y, si no se proporciona, el requiremétodo arroja un error. Devuelve una instancia de ActionController::Parameterspara la clave pasada require.

El permitmétodo devuelve una copia del objeto de parámetros, devolviendo solo las claves y valores permitidos. Al crear un nuevo modelo ActiveRecord, solo los atributos permitidos se pasan al modelo.

Se parece mucho a la lista blanca que se incluía anteriormente en los modelos ActiveRecord, pero tiene más sentido que esté en el controlador.

fivedigit
fuente
37
La descripción del permiso está un poco apagada: el permiso devuelve otro hash que contiene solo la clave permitida Y (esto es crítico) responderá con trueel permitted?método. Por defecto, una instancia de la ActionController::Parametersclase volverá falsepara permitted?responder truea permitted?significa que el objeto de parámetro se puede usar en la asignación masiva; de lo contrario, la aplicación arrojará un error de atributos prohibidos.
Sameers
3
¿El encadenamiento permitde requirepermitir también e incluyen los parámetros necesarios en el objeto devuelto?
Dennis
Encuentro que los nombres son desafortunados, ya que require hace mucho más que hacer que se requiera un parámetro permitido. El uso de params.permit (: person,: name,: age) no funciona y genera errores como "Parámetros no permitidos:: utf8" para una forma típica.
Damien
6

Para ser más precisos, cuando creas, por ejemplo. haciendo .new(...), debe haber un :personhash indicado por require y el hash de la persona solo aceptará :namee :ageindicará con un permiso.

Ejemplo:

.new(person: { name: "Bhojendra", age: 32 }) // okay
.new(person: { name: "Rauniyar" }) // okay
.new(person: { name: "Bhojendra", other: 'asdf' }) // not okay, other not permitted
.new(person: { full_name: "Bhojendra Rauniyar" }) // not okay, full_name not permitted
.new(detail: { name: "Bhojendra", age: 32 }) // not okay, must be person
Bhojendra Rauniyar
fuente
¿Qué not okayvisualizan el tercer y cuarto ejemplo?
p0k8_
@ p0k8_ Edité la respuesta para aclarar eso. Esos ejemplos muestran algunos nombres de campo diferentes que no fueron "permitidos".
Harry Wood