Je reçois un paramètre et je veux que ce soit une chaîne comme celle-ci:

"abc,efg"

Ou un tableau comme celui-ci

["abc","efg"]

Dans le premier cas, je veux le convertir en un tableau, quel serait le bon moyen?

Voici ce que j'ai pensé

if params[:ids] && params[:ids].is_a? Array
     ids = params[:ids]
else if params[:ids]
    ids = params[:ids].split(",")
1
BastienSander 17 nov. 2017 à 16:50

5 réponses

Meilleure réponse

J'utiliserais un ternaire pour que cela reste simple et sur une seule ligne:

ids = params[:ids].is_a?(String) ? params[:ids].split(',') : params[:ids]

J'ai inversé l'ordre afin que vous n'obteniez pas une erreur de méthode non définie si vous essayez d'appeler split sur nil si params[:ids] est manquant.

3
SRack 17 nov. 2017 à 15:24

Je pense que le moyen le plus court serait d'utiliser .try. Cela vous évite d'écrire un if-then-else.

params_id = params[:id].try(:split, ',')
0
Ryan Taylor 17 nov. 2017 à 21:49

Toutes mes excuses pour l'empilement. Mais j'ai pensé que j'offrirais une légère modification à la réponse proposée par SickLickWill (qui ne gère pas tout à fait correctement le cas Array):

ids = params[:id].split(',').flatten

Cela gérera très bien le cas String:

:001 > params = {id: "abc,efg"}
:002 > ids = params[:id].split(',').flatten
 => ["abc", "efg"] 

Ainsi que le cas Array:

:003 > params = {id: ["abc","efg"]}
:004 > ids = params[:id].split(',').flatten
 => ["abc", "efg"] 

S'il y a une chance que le paramètre id soit nul, alors ce barfs:

:005 > params = {}
 => {} 
:006 > ids = params[:id].split(',').flatten
NoMethodError: undefined method `split' for nil:NilClass

Donc, vous pouvez faire un test conditionnel:

:007 > ids = params[:id].split(',').flatten if params[:id]
 => nil 

Ou utilisez try:

:008 > ids = params[:id].try(:split, ',').try(:flatten)
 => nil 
1
jvillian 17 nov. 2017 à 17:29

Vous manquez la balise end et vous avez une erreur else if et vous pouvez supprimer le chèque de params[:ids] car si la clé :ids n'existe pas is_a? retour {{X5} }

Je pense que tu peux le faire

ids = if params[:ids].is_a? Array
          params[:ids]
      elsif params[:ids]
          params[:ids].split(",")
      end
0
inye 17 nov. 2017 à 14:21
Array.wrap(params[:ids]).map{|x| x.split(',')}.flatten
1
aromero 17 nov. 2017 à 14:50
47352146