使用javascript从客户端在Rails上设置时区
我有一个设置时区的网络应用程序使用javascript从客户端在Rails上设置时区,javascript,ruby-on-rails,cookies,timezone,Javascript,Ruby On Rails,Cookies,Timezone,我有一个设置时区的网络应用程序 post_controller.rb before_filter :set_time_zone def set_time_zone Time.zone = user.time_zone end 现在,我不想在注册时从用户那里获取时区,而是想知道如何从客户端动态设置时区,并在before\u过滤器中进行设置。 我试着用。gem提供了一种访问客户端时区的简单方法,只需从js文件中调用如下函数 $(document).ready(function(){
post_controller.rb
before_filter :set_time_zone
def set_time_zone
Time.zone = user.time_zone
end
现在,我不想在注册时从用户那里获取时区,而是想知道如何从客户端动态设置时区,并在before\u过滤器中进行设置。
我试着用。gem提供了一种访问客户端时区的简单方法,只需从js文件中调用如下函数
$(document).ready(function(){
$('#your_input_id').set_timezone();
});
现在,上面的代码自动设置hiddenfield输入或select输入,但我想知道您是否可以简单地使用函数调用保存到会话并从Rails服务器检索它。我猜当用户第一次访问站点时,可以设置时区,会话值可以用于为剩余的访问设置时区。我认为可以使用session值在before过滤器中设置时区。由于对javascript非常陌生,我不知道如何访问Rail的加密cookie存储来设置值。这可能吗?如果是,我该怎么做?
提前感谢,我们的做法有些不同。如果我们想从JS收集时区,我们使用
gon
在Rails端设置一个变量。然后,我们在客户端上有JS代码来检查该变量,如果设置了,则使用脚本返回的时区字符串(返回IANA时区键)向端点发送XHR post(就像OP所做的那样)。最后,为了将其转换为Rails 3.2.19时区名称,我们做了ActiveSupport::timezone::MAPPING.invert[iana_key]
。它采取了一些步骤来解决这个问题,希望它能帮助别人。我们的做法有所不同。如果我们想从JS收集时区,我们使用gon
在Rails端设置一个变量。然后,我们在客户端上有JS代码来检查该变量,如果设置了,则使用脚本返回的时区字符串(返回IANA时区键)向端点发送XHR post(就像OP所做的那样)。最后,为了将其转换为Rails 3.2.19时区名称,我们做了ActiveSupport::timezone::MAPPING.invert[iana_key]
。我这样做,如果时区没有在Cookie中设置,我会打一个ajax电话,因为你是新来的,所以请提醒接受答案如果合适我这样做,如果时区没有在Cookie中设置,我会打一个ajax电话因为你是新来的,所以请提醒接受答案如果合适的话
#javascript
function readCookieValue(cookieName)
{
return (result = new RegExp('(?:^|; )' + encodeURIComponent(cookieName) + '=([^;]*)').exec(document.cookie)) ? decodeURIComponent(result[1]) : null;
}
$(document).ready(function(){
if(readCookieValue("time_zone") === null) {
$.post('/set_time_zone',
{ 'offset_minutes':(-1 * (new Date()).getTimezoneOffset())});
}
#controller:
def set_time_zone
offset_seconds = params[:offset_minutes].to_i * 60
@time_zone = ActiveSupport::TimeZone[offset_seconds]
@time_zone = ActiveSupport::TimeZone["UTC"] unless @time_zone
if @time_zone
cookies[:time_zone] = @time_zone.name if @time_zone
render :text => "success"
else
render :text => "error"
end
end