Otrzymuję parametr i chcę, aby był to łańcuch taki jak ten
"abc,efg"
lub taki Array
["abc","efg"]
W pierwszym przypadku chciałbym przekształcić go w tablicę, co byłoby dobrym sposobem?
Oto, co myślałem
if params[:ids] && params[:ids].is_a? Array
ids = params[:ids]
else if params[:ids]
ids = params[:ids].split(",")
Odpowiedzi:
3 dla odpowiedzi № 1Użyłem do tego trójskładnika, aby zachować prostotę i jedną linię:
ids = params[:ids].is_a?(String) ? params[:ids].split(",") : params[:ids]
Zmieniłem kolejność, więc nie próbujesz uzyskać niezdefiniowanego błędu metody, jeśli spróbujesz zadzwonić split
na nil
powinien params[:ids]
brakować.
1 dla odpowiedzi nr 2
Array.wrap(params[:ids]).map{|x| x.split(",")}.flatten
1 dla odpowiedzi nr 3
Przepraszam za palowanie. Pomyślałem jednak, że zaproponuję nieznaczne ulepszenie odpowiedzi zaproponowanej przez SickLickWill (która nie radzi sobie z Array
sprawa poprawnie):
ids = params[:id].split(",").flatten
To obsłuży String
sprawa w porządku:
:001 > params = {id: "abc,efg"}
:002 > ids = params[:id].split(",").flatten
=> ["abc", "efg"]
Tak dobrze jak Array
walizka:
:003 > params = {id: ["abc","efg"]}
:004 > ids = params[:id].split(",").flatten
=> ["abc", "efg"]
Jeśli jest jakaś szansa id
param będzie zerowy, wtedy ten barfs:
:005 > params = {}
=> {}
:006 > ids = params[:id].split(",").flatten
NoMethodError: undefined method `split" for nil:NilClass
Więc możesz poddać się warunkowemu testowi:
:007 > ids = params[:id].split(",").flatten if params[:id]
=> nil
Albo użyj try
:
:008 > ids = params[:id].try(:split, ",").try(:flatten)
=> nil
0 dla odpowiedzi nr 4
Tęsknisz end
tag, a mylisz się else if
i możesz usunąć czek params[:ids]
ponieważ jeśli :ids
klucz nie istnieje is_a?
powrót NilClass
Myślę, że możesz to zrobić
ids = if params[:ids].is_a? Array
params[:ids]
elsif params[:ids]
params[:ids].split(",")
end
0 dla odpowiedzi № 5
Myślę, że najkrótszą drogą byłoby użycie .try
. Oszczędność od wypisania if-then-else.
params_id = params[:id].try(:split, ",")