Как удалить строку из массива с Ruby 2.5.3? - PullRequest
0 голосов
/ 30 ноября 2018

Я разрабатываю на Ruby on Rails 5.2.С целью управления переводами я хочу позволить пользователю выбирать язык, который отличается от его текущего языка.Список настроенных языков приложения:

 all_languages = I18n.config.available_locales

all_languages ​​- Массив.puts all_languages возвращает:

en fr de it

Язык пользователя определен в таблице пользователей.Метод возвращает язык текущего пользователя

user_language = current_user.language

user_language - String.puts user_language возвращает:

en

Я пытаюсь применить метод delete (obj) к массиву, но это не меняет массив:

all_languages.delete(user_language)

Я пытаюсь работать надтолько массивы, но он не изменяет массив языков:

remove_language = Array.new
remove_language << user_language

puts remove_language возвращает:

en

puts all_languages - remove_language возвращает:

en fr de it

где ru язык должен быть удален.Я не понимаю, почему он остается в списке!

Ответы [ 4 ]

0 голосов
/ 30 ноября 2018

Ваш код не работает, потому что available_locales возвращает массив символов , и вы пытаетесь удалить строку .

a = [:en, :fr, :de, :it]
a.delete('en')
#=> nil

a #=> [:en, :fr, :de, :it]

Toисправить это, вы должны превратить вашу строку в символ.Кроме того, вы должны избегать delete, потому что это модифицирует приемник (изменение available_locales может привести к ошибкам позже).Вместо этого вы можете использовать Rails 'Array#without, который возвращает новый массив:

all_languages = I18n.config.available_locales
#=> [:en, :fr, :de, :it]

user_language = current_user.language.to_sym
#=> :en

all_languages.without(user_language)
#=> [:fr, :de, :it]
0 голосов
/ 30 ноября 2018

Попробуйте это

all_languages = ["en","fr","de","it"]
user_language = "en"
all_languages.delete_at(all_languages.index(user_language))

#=> ["fr","de","it"]
0 голосов
/ 30 ноября 2018

I18n.config.available_locales возвращает символы *.А твой current_user.language это строка."en" совсем не то же самое, что :en.Тем не менее, это должно работать:

all_languages = I18n.config.available_locales.dup # copy the array
all_languages.delete(:en)
# or, for your case
all_languages.delete(current_user.language.to_sym)


# non-mutating way
all_langs_without_en = I18n.config.available_locales.reject { |loc| loc == :en }

* по крайней мере в рельсах 4.2, где я это проверял.

0 голосов
/ 30 ноября 2018

Это решение должно удовлетворить ваши потребности:

l = I18n.config.available_locales
l.pop
I18n.config.available_locales = l
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...