You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby on Rails中jQuery Timepicker Ajax函数如何访问@tour变量

解决jquery-timepicker获取后端@tour时间范围的问题

看起来你遇到的核心问题是后端的@tour变量无法直接被前端JS/Ajax访问——因为@tour是服务器端的实例对象,前端代码运行在浏览器里,根本不知道这个变量的存在,所以直接在JS里引用会报错“tour不存在”。下面给你两种最常用的解决思路:

方法一:直接在视图中注入后端变量(最简单,适合静态场景)

如果你的@tour是页面加载时就已经从控制器传递过来的,不需要动态刷新,那直接在视图的<script>标签里把@tour的时间数据转成前端能识别的JS变量就行。

假设你用的是Rails ERB模板(从@tour的写法推测大概率是),可以这么写:

<script>
// 把后端@tour的时间转成小时数,注入到全局JS变量里
window.tourTimeRange = {
  startHour: <%= @tour.start_date.hour %>,
  endHour: <%= @tour.end_date.hour %>
};

// 初始化timepicker时直接用这个变量
$(function() {
  $('#your-timepicker-element').timepicker({
    hourMin: tourTimeRange.startHour,
    hourMax: tourTimeRange.endHour,
    // 其他timepicker配置...
  });
});
</script>

这样前端JS就能直接拿到后端传递的小时数,不会再出现变量不存在的错误。如果需要处理分钟或者完整时间戳,可以把.hour换成.min获取分钟,或者用.to_i获取时间戳、.iso8601转成标准时间字符串。

方法二:用Ajax动态获取(适合需要异步加载的场景)

如果你的@tour是后续动态生成的(比如用户选择某个 tour 后才加载),那需要后端提供一个接口返回该tour的时间数据,前端通过Ajax请求获取:

1. 后端添加路由和接口

在routes.rb里加一个接口路由:

get '/tours/:id/time_range', to: 'tours#time_range'

然后在tours_controller.rb里实现接口方法:

def time_range
  @tour = Tour.find(params[:id])
  # 返回JSON格式的时间数据
  render json: {
    start_hour: @tour.start_date.hour,
    end_hour: @tour.end_date.hour
    // 如果需要分钟可以加上start_min: @tour.start_date.min等
  }
end

2. 前端Ajax请求并初始化timepicker

// 假设你已经拿到了tour的ID(可以从DOM元素的data属性获取,比如<div data-tour-id="<%= @tour.id %>">)
const tourId = $('#selected-tour').data('tour-id');

$.get(`/tours/${tourId}/time_range`, function(response) {
  // 请求成功后初始化timepicker
  $('#your-timepicker-element').timepicker({
    hourMin: response.start_hour,
    hourMax: response.end_hour,
    // 其他配置...
  });
})
.fail(function() {
  console.error('获取tour时间范围失败');
});

关键注意点

  • 时区问题:如果你的start_date/end_date存储的是UTC时间,记得转成用户本地时区的小时数,避免出现时间偏移。比如在Rails里可以用@tour.start_date.in_time_zone.hour。
  • 变量作用域:如果不想用全局变量(window.tourTimeRange),可以把变量包裹在IIFE(立即执行函数)里,避免污染全局作用域。

内容的提问来源于stack exchange,提问作者Stella Han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:53:15