如何处理整个应用程序中的持续币种转换?

时间:2019-06-24 06:12:02

标签: ruby-on-rails ruby-on-rails-3 session

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

当用户在一页上选择一种货币时,它将重新加载页面并相应地设置session[:currency]变量。挑战在于,取决于他们从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中。

我想念什么?

1 个答案:

答案 0 :(得分: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)