Cómo probar si existen parámetros en rails
Estoy usando una instrucción IF en Ruby on Rails para probar si los parámetros de la solicitud están establecidos. Independientemente de si se establecen o no ambos parámetros, se activa la primera parte del siguiente bloque if. ¿Cómo puedo hacer que esta parte SOLO se active si ambos parámetros[:uno] y parámetros[:dos] están establecidos?
if (defined? params[:one]) && (defined? params[:two])
... do something ...
elsif (defined? params[:one])
... do something ...
end
14 answers
Quieres has_key?
:
if(params.has_key?(:one) && params.has_key?(:two))
Simplemente marcando if(params[:one])
se dejará engañar por un valor "allí pero cero" y "allí pero falso" y usted está preguntando acerca de la existencia. Es posible que tenga que diferenciar:
- No hay en absoluto.
- Allí, pero
nil
. - Allí, pero
false
. - Solo hay una cadena vacía.
También. Difícil de decir sin más detalles de su situación precisa.
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
2013-09-09 17:32:29
Soy un fan de
params[:one].present?
Solo porque mantiene la forma params[sym] para que sea más fácil de leer.
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
2013-11-08 15:09:42
¿Usar espacio en blanco? http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
unless params[:one].blank? && params[:two].blank?
Devolverá true si está vacío o nil
También... eso no funcionará si está probando valores booleanos.. desde
>> false.blank?
=> true
En ese caso se podría utilizar
unless params[:one].to_s.blank? && params[:two].to_s.blank?
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
2013-03-25 15:36:38
Simple como pastel:
if !params[:one].nil? and !params[:two].nil?
#do something...
elsif !params[:one].nil?
#do something else...
elsif !params[:two].nil?
#do something extraordinary...
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
2011-04-12 01:47:44
Puedes escribirlo de forma más sucinta como lo siguiente:
required = [:one, :two, :three]
if required.all? {|k| params.has_key? k}
# here you know params has all the keys defined in required array
else
...
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-20 16:44:06
Una forma muy sencilla de proporcionar valores predeterminados a sus parámetros: params[:foo] ||= 'default value'
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
2012-06-02 01:44:49
if params[:one] && params[:two]
... do something ...
elsif params[:one]
... do something ...
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
2011-04-12 01:26:03
Acabo de leer esto en las clases de RubyInRails http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F
Puede usar el método blank?
que es equivalente a params[:one].nil? || params[:one].empty?
(p. ej.)
if params[:one].blank?
# do something if not exist
else
# do something if exist
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
2017-11-07 12:42:10
También puedes hacer lo siguiente:
unless params.values_at(:one, :two, :three, :four).includes?(nil)
... excute code ..
end
Tiendo a usar la solución anterior cuando quiero verificar más de uno o dos parámetros.
.values_at devuelve y array con nil en el lugar de cualquier clave param indefinida. i. e:
some_hash = {x:3, y:5}
some_hash.values_at(:x, :random, :y}
Devolverá lo siguiente:
[3,nil,5]
.incluye?(nil) luego comprueba la matriz para cualquier valor nil. Devolverá true si el array incluye nil.
En algunos casos es posible que también desee comprobar que los parámetros no contienen y están vacíos cadena con valor falso.
Puede manejar esos valores agregando el siguiente código encima de la instrucción unless.
params.delete_if{|key,value| value.blank?}
Todo en conjunto se vería así:
params.delete_if{|key,value| value.blank?}
unless params.values_at(:one, :two, :three, :four).includes?(nil)
... excute code ..
end
Es importante tener en cuenta que delete_if modificará tu hash/params, así que úsalo con precaución.
La solución anterior claramente requiere un poco más de trabajo para configurarla, pero vale la pena si está comprobando más de uno o dos parámetros.
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-05-29 16:29:46
Esto es lo que hago,
before_action :validate_presence
Y luego los siguientes métodos:
def check_presence
params[:param1].present? && params[:param2].present?
end
def validate_presence
if !check_presence
render json: {
error: {
message: "Bad Request, parameters missing.",
status: 500
}
}
end
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
2016-03-03 05:24:07
if params[:one] && param[:two]
... excute code ..
end
También puede comprobar si los parámetros están vacíos usando params[:two].vacío
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
2011-04-12 01:28:53
Intento una respuesta tardía, pero de lejos:
Si desea saber si se establecen valores en un hash (cualquiera), all above responde a true, dependiendo de su punto de vista.
Si quieres probar tu (GET/POST..) params, usted debe utilizar algo más especial a lo que usted espera que sea el valor de params[:one]
, algo como
if params[:one]~=/ / and params[:two]~=/[a-z]xy/
Ignorando los parámetros (GET / POST) como si no estuvieran configurados, si no encajan como se espera
Solo un if params[:one]
con o sin detección nil/true es un paso para abrir su página para hackear, porque, por lo general, es el siguiente paso para usar algo como select ... where params[:one] ...
, si esto es intencionado o no, activo o dentro o después de un marco.
Una respuesta o solo una pista
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
2013-12-03 23:50:23
Simplemente juntó esto para el mismo problema:
before_filter :validate_params
private
def validate_params
return head :bad_request unless params_present?
end
def params_present?
Set.new(%w(one two three)) <= (Set.new(params.keys)) &&
params.values.all?
end
La primera línea comprueba si nuestras claves de destino están presentes en las claves de los parámetros usando el subconjunto
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-09-03 20:08:16
Además de las respuestas anteriores: has_key?
y has_value?
tienen alternativas más cortas en forma de key?
y value?
. Ruby team también sugiere usar alternativas más cortas, pero para legibilidad algunos podrían preferir versiones más largas de estos métodos.
Por lo tanto, en su caso sería algo como
if params.key?(:one) && params.key?(:two)
... do something ...
elsif params.key?(:one)
... do something ...
end
NB! .key?
simplemente comprobará si la clave existe e ignora el valor posible. Para ex:
2.3.3 :016 > a = {first: 1, second: nil, third: ''}
=> {:first=>1, :second=>nil, :third=>""}
2.3.3 :017 > puts "#{a.key?(:first)}, #{a.key?(:second)}, #{a.key?(:third), #{a.key?(:fourth)}}"
true, true, true, false
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
2017-06-29 10:38:19