如何在我的应用程序中处理持续的货币转换?

How do I handle persistent currency switching throughout my app?

我的应用支持 3 种货币 GBP, JMD, USD

当用户 select 在一个页面上使用货币时,它会重新加载页面并相应地设置 session[:currency] 变量。挑战在于,根据它们 select 3 种货币的不同,行为并不总是可预测和相同的。

我可能只是看这个逻辑太久了,但我不明白为什么它不起作用,希望多一双眼睛。

所以我在我的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.

我错过了什么?

使用映射会比使用很多 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)