Я поддерживаю 3 валюты в своем приложении GBP, JMD, USD
.
Когда пользователь выбирает валюту на одной странице, он перезагружает страницу и соответствующим образом устанавливает переменную session[:currency]
. Проблема в том, что в зависимости от валюты, которую они выбирают из трех, поведение не всегда предсказуемо и одинаково.
Возможно, я просто слишком долго смотрел на эту логику, но я не могу понять, почему она не работает, и мне бы хотелось иметь дополнительную пару глаз.
Итак, я начал с этого в моем application_controller.rb
:
unless params[:currency].blank?
if params[:currency] != session[:currency] || session[:previous_currency].blank?
session[:previous_currency] = session[:currency]
session[:currency] = params[:currency]
end
else
if session[:currency].blank?
session[:currency] = 'JMD'
end
end
Это не совсем захватило USD, GBP
.
Так что с тех пор это было изменено на это:
unless params[:currency].blank? && session[:currency].blank?
if (params[:currency].eql? "JMD") || (session[:currency].eql? "JMD")
session[:currency] = 'JMD'
session[:locale] = :en
session[:previous_currency] = 'GBP'
elsif (params[:currency].eql? "GBP") || (session[:currency].eql? "GBP")
session[:locale] = :"en-GB"
elsif (params[:currency].eql? "USD") || (session[:currency].eql? "USD")
session[:locale] = :en
elsif params[:currency] != session[:currency] || session[:previous_currency].blank?
session[:previous_currency] = session[:currency]
session[:currency] = params[:currency]
end
else
session[:currency] = 'JMD'
session[:locale] = :en
end
Проблема в том, что это не работает, когда я перехожу с любой валюты на GBP
, и я не могу понять, почему.
Я имею в виду, скажем, я меняю USD
на GBP
. Если я перехожу на другую страницу (скажем, на домашнюю страницу), она возвращается к валюте по умолчанию JMD
. Когда я хочу, чтобы он оставался GBP
, как это происходит, если я переключаюсь на USD
и меняю страницы, все остается в USD
.
Что мне не хватает?
Интересное решение @Archer. Не могли бы вы конкретизировать это как полный ответ?
С маппингом было бы намного проще, как и с множеством elsif
.
Надеюсь, это логично. Нелегко четко понять вашу проблему, но, возможно, это поможет.
if params[:currency] != session[:currency] || session[:previous_currency].blank?
return session.merge!(previous_currency: session[:currency], params[:currency])
end
default = { currency: 'JMD', locale: :en }
mapping = { 'JMD': { currency: 'JMD', locale: :en, previous_currency: 'GBP' },
'GBP': { locale: :"en-GB" },
'USD': { locale: :en } }
# if you're using Ruby >= 2.3.0
values = mapping.detect{ |k, v| k.to_s == params[:currency] || session[:currency] }&.last
# if you're using Ruby < 2.3.0
values = mapping.detect{ |k, v| k.to_s == params[:currency] || session[:currency] }.try(&:last)
session.merge!(values || default)
Было бы проще, если бы вы создали маппинг-хеш для валют, а потом объединились с сессией
session.merge!(mapping[params[:currency])