O que `params.require (: person) .permit (: name,: age)` está fazendo no Rails 4?

149

Todos os exemplos de parâmetros fortes nos documentos do Rails 4 usam

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

Alguém poderia agradar desconstruir e explicar o que está ocorrendo com requiree permitaqui?

Erik Trautman
fonte
3
Este exemplo vem diretamente da documentação, que explica, permitmas não require.
Erik Trautman

Respostas:

202

O paramsem um controlador se parece com um Hash, mas na verdade é uma instância de ActionController::Parameters, que fornece vários métodos como requiree permit.

O requiremétodo garante que um parâmetro específico esteja presente e, se não for fornecido, o requiremétodo gera um erro. Retorna uma instância de ActionController::Parameterspara a chave passada require.

O permitmétodo retorna uma cópia do objeto de parâmetros, retornando apenas as chaves e valores permitidos. Ao criar um novo modelo ActiveRecord, apenas os atributos permitidos são passados ​​para o modelo.

Parece muito com a lista de desbloqueio anteriormente incluída nos modelos ActiveRecord, mas faz mais sentido que ela esteja no controlador.

fivedigit
fonte
37
A descrição da permissão está um pouco errada: a permissão retorna outro hash que contém apenas a chave permitida E (isso é crítico) responderá com trueo permitted?método. Por padrão, uma instância da ActionController::Parametersclasse retornará falsepara permitted?Respondendo truea permitted?, para que o objeto de parâmetro possa ser usado na atribuição em massa; caso contrário, o aplicativo lançará um erro ForbiddenAttributes.
Sameers
3
O encadeamento permitde requiretambém permitir e incluem os parâmetros necessários no objeto retornado?
216 Dennis
Acho a nomeação lamentável, pois exigir faz muito mais do que exigir um parâmetro permitido. O uso de params.permit (: pessoa,: nome,: idade) não funciona e gera erros como "Parâmetros não permitidos:: utf8" para um formulário típico.
Damien
6

Para ser mais preciso, quando você cria, por exemplo. Ao fazê-lo .new(...), deve haver :personhash indicado por exigir e o hash da pessoa só aceitará :namee :ageindicado por permissão.

Exemplo:

.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
fonte
O que os terceiro e quarto not okayexemplos visualizam?
P0k8_ 17/05/19
@ p0k8_ Editei a resposta para esclarecer isso. Esses exemplos mostram alguns nomes de campos diferentes que não foram "permitidos".
Harry Wood