如何在我的应用程序中处理持续的货币转换?
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)
我的应用支持 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)