rails formularios dinamicos consultas anidados anidadas ruby-on-rails ruby ruby-on-rails-3.2 ruby-on-rails-4 strong-parameters

ruby-on-rails - dinamicos - ruby on rails formularios anidados



los parĂ¡metros fuertes permiten todos los atributos para los atributos anidados (5)

El objetivo de los parámetros fuertes está en su nombre: hacer que sus parámetros de entrada sean fuertes.
Permitir todos los parámetros sería una muy mala idea, ya que permitiría a cualquier persona insertar valores que no necesariamente desea que sus usuarios actualicen.

En el ejemplo que das, mencionas los dos parámetros que debes proporcionar actualmente:
[:lever_id, :explanation] .

Si permitía todos los parámetros, alguien podría cambiar cualquier otro valor.
created_at , o lever_id por ejemplo.

Esto definitivamente sería un problema de seguridad y es por eso que no deberías hacerlo.
Especificar explícitamente todos tus atributos puede parecer aburrido cuando lo haces.
Pero esto es necesario para mantener su aplicación segura.

Editar : para que la gente vote esto abajo. Puede que esta no sea la respuesta que está buscando, pero es la respuesta que necesita.
Incluir en lista blanca todos los atributos anidados es un gran defecto de seguridad con el que los params fuertes intentan protegerlo, y lo está eliminando.
Eche un vistazo a lo que condujo a la construcción de strong_params, y cómo no usarlo puede ser malo para usted: https://gist.github.com/peternixey/1978249

¿Hay alguna manera en los parámetros potentes de permitir todos los atributos de un modelo de atributos anidados ? Aquí hay un código de muestra.

class Lever < ActiveRecord::Base has_one :lever_benefit accepts_nested_attributes_for :lever_benefit end class LeverBenefit < ActiveRecord::Base # == Schema Information # id :integer not null, primary key # lever_id :integer # explanation :text end

Para los parámetros de palanca fuerte estoy escribiendo actualmente esto

def lever params.require(:lever).permit(:name,:lever_benefit_attributes => [:lever_id, :explanation]) end

¿Hay alguna forma de que los atributos anidados puedan escribir para permitir todos los atributos sin dar explícitamente el nombre de los atributos como lever_id y la explanation ?

Nota : ¡No se confunda con esta pregunta con permit! o permit(:all) esto es para permitir todos los atributos anidados


En realidad, hay una manera de simplemente listar todos los parámetros anidados.

params.require(:lever).permit(:name).tap do |whitelisted| whitelisted[:lever_benefit_attributes ] = params[:lever][:lever_benefit_attributes ] end

Este método tiene una ventaja sobre otras soluciones. Permite permitir parámetros anidados profundos.

Mientras que otras soluciones como:

nested_keys = params.require(:lever).fetch(:lever_benefit_attributes, {}).keys params.require(:lever).permit(:name,:lever_benefit_attributes => nested_keys)

No lo hagas

Fuente:

https://github.com/rails/rails/issues/9454#issuecomment-14167664


La única situación que he encontrado donde permitir claves arbitrarias en un hash de params anidado me parece razonable cuando escribo en una columna serializada. Me las arreglé para manejarlo así:

class Post serialize :options, JSON end class PostsController < ApplicationController ... def post_params all_options = params.require(:post)[:options].try(:permit!) params.require(:post).permit(:title).merge(:options => all_options) end end

try se asegura de que no necesitemos los regalos de una tecla :options .


Primero, asegúrese de que realmente desea permitir todos los valores en un hash anidado. Lea la respuesta de Damien MATHIEU para comprender la posible apertura de agujeros de seguridad ...

Si aún necesita / desea permitir todos los valores en un hash (hay casos de uso perfectamente válidos para esto, por ejemplo, almacenar metadatos no estructurados proporcionados por el usuario para un registro), puede lograrlo utilizando los siguientes bits de código:

def lever_params nested_keys = params.require(:lever).fetch(:lever_benefit_attributes, {}).keys params.require(:lever).permit(:name,:lever_benefit_attributes => nested_keys) end

Nota: Esto es muy similar a la respuesta de tf. Pero un poco más elegante ya que no obtendrá ningún Unpermitted parameters: lever_benefit_attributes no Unpermitted parameters: lever_benefit_attributes advertencias / errores.


tratar

params.require(:lever).permit(:name, leave_benefit_attributes: LeaveBenefit.attribute_names.collect { |att| att.to_sym })