/ / Rails - dobry sposób na konwersję ciągu znaków na tablicę, jeśli nie szyny tablicy - ruby-on-rails, tablice, parametry

Railsy - dobry sposób na konwersję ciągów do tablicy, jeśli nie szyny tablicowe - ruby-on-rails, tablice, parametry

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 № 1

Uż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, ",")