Los parámetros fuertes requieren múltiples


Estoy recibiendo un paquete JSON como:

{
  "point_code" : { "guid" : "f6a0805a-3404-403c-8af3-bfddf9d334f2" }
}

Me gustaría decirle a Rails que tanto point_code como guid son necesarios, no solo permitidos.

Este código parece funcionar, pero no creo que sea una buena práctica ya que devuelve una cadena, no el objeto completo:

params.require(:point_code).require(:guid)

Alguna idea de cómo podría hacer esto?

Author: the Tin Man, 2014-03-18

5 answers

Tenía una necesidad similar y lo que hice fue

def point_code_params
  params.require(:point_code).require(:guid) # for check require params
  params.require(:point_code).permit(:guid) # for using where hash needed
end

Ejemplo:

def create
  @point_code = PointCode.new(point_code_params)
end
 24
Author: sarunw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-04 16:58:03

A partir de 2015 (RoR 5.0+) puede pasar una matriz de claves al método require en rails:

params.require([:point_code, :guid])

Http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-require

 7
Author: raveren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-31 16:43:38

OK, no es bonito, pero debería hacer el truco. Supongamos que tiene params: foo,: bar y: baf que le gustaría requerir todo para una cosa. Se podría decir

def thing_params
  [:foo, :bar, :baf].each_with_object(params) do |key, obj|
    obj.require(key)
  end
end

each_with_object devuelve obj, que se inicializa como parámetros. Usando el mismo obj de parámetros se requiere cada una de esas claves por turno, y se devuelve finalmente el objeto. No es bonito, pero funciona para mí.

 6
Author: EdvardM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-06 09:01:06

require toma un parámetro. Así que no hay manera de que pueda pasar varias claves a menos que anule el método require. Usted puede lograr lo que desea con un poco de lógica adicional en su acción:

def action
  raise ActionController::ParameterMissing.new("param not found: point_code") if point_params[:point_code].blank?
  raise ActionController::ParameterMissing.new("param not found: guid") if point_params[:point_code][:guid].blank?

  <do your stuff>
end

def point_params
  params.permit(point_code: :guid)
end
 0
Author: usha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-08 17:31:14

Esta pregunta surgió en mi búsqueda de Google para un caso diferente, es decir, cuando se utiliza un "múltiple: verdadero"como en:

<%= form.file_field :asset, multiple: true %>

Que es un caso totalmente diferente a la pregunta. Sin embargo, en el interés de ayudar aquí es un ejemplo de trabajo en Rails 5+ de que:

form_params = params.require(:my_profile).permit({:my_photos => []})
 0
Author: Nate Flink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-16 19:19:15