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?
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
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
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í.
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
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 => []})
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