Как мне справиться с постоянным переключением валюты в моем приложении?

Я поддерживаю 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.

Что мне не хватает?

Было бы проще, если бы вы создали маппинг-хеш для валют, а потом объединились с сессией session.merge!(mapping[params[:currency])

Archer 24.06.2019 19:19

Интересное решение @Archer. Не могли бы вы конкретизировать это как полный ответ?

marcamillion 24.06.2019 21:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С маппингом было бы намного проще, как и с множеством 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)

Другие вопросы по теме