use*_*081 1 ruby arrays ruby-on-rails
我在Ruby on Rails 5.2上开发.为了管理翻译,我希望允许用户选择与他当前语言不同的语言.应用程序的已配置语言列表是
all_languages = I18n.config.available_locales
Run Code Online (Sandbox Code Playgroud)
all_languages是一个数组.puts all_languages收益:
en fr de it
Run Code Online (Sandbox Code Playgroud)
用户语言在users表中定义.方法返回当前用户的语言
user_language = current_user.language
Run Code Online (Sandbox Code Playgroud)
user_language是一个String.puts user_language收益:
en
Run Code Online (Sandbox Code Playgroud)
我尝试将delete(obj)方法应用于数组,但这不会改变数组:
all_languages.delete(user_language)
Run Code Online (Sandbox Code Playgroud)
我尝试只处理数组,但它不会改变语言数组:
remove_language = Array.new
remove_language << user_language
Run Code Online (Sandbox Code Playgroud)
puts remove_language 收益:
en
Run Code Online (Sandbox Code Playgroud)
puts all_languages - remove_language 收益:
en fr de it
Run Code Online (Sandbox Code Playgroud)
应删除en语言的地方.我不明白为什么它仍然在列表中!
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 }
Run Code Online (Sandbox Code Playgroud)
*至少在rails 4.2中,我检查了这个.