Rails中如何在视图里正确引用数组元素输出时间范围
Rails视图遍历时间数组的错误修复方案
问题说明
在Rails项目中定义了days和to_ice_cube_time方法,to_ice_cube_time返回由开始时间、结束时间及星期符号组成的二维数组。但在视图中遍历数组时,用timerange.start_time取值触发undefined method 'start_time'错误,需要正确的元素引用方式来输出对应星期的时间范围。
相关代码
模型方法
def days { monday: monday, tuesday: tuesday, wednesday: wednesday, thursday: thursday, friday: friday, saturday: saturday, sunday: sunday } end def to_ice_cube_time [start_time, end_time, *days.compact_blank.keys] end
数组输出示例
[["6:00 AM", "8:00 AM", :monday, :tuesday], ["9:00 AM", "6:00 PM", :thursday, :friday], ["8:00 AM", "4:00 PM", :monday, :tuesday]]
错误视图代码
<% scheduleevent.to_ice_cube_time.each do |timerange| %> <p><%= timerange.start_time %> - <%= timerange.end_time %> </p> <% end %>
报错信息
undefined method 'start_time' for [["6:00 AM", "8:00 AM", :monday, :tuesday], ["9:00 AM", "6:00 PM", :thursday, :friday], ["8:00 AM", "4:00 PM", :monday, :tuesday]]:Array
修复方案
方案1:直接通过数组索引访问
to_ice_cube_time返回的每个timerange是普通数组,不是带属性的对象,因此要用索引获取对应位置的值:
修改后的视图代码:
<% scheduleevent.to_ice_cube_time.each do |timerange| %> <% start = timerange[0] %> <% finish = timerange[1] %> <% weekdays = timerange[2..-1] %> <p><%= start %> - <%= finish %> (星期:<%= weekdays.map(&:humanize).join('、') %>)</p> <% end %>
timerange[0]:获取开始时间timerange[1]:获取结束时间timerange[2..-1]:获取所有星期符号,map(&:humanize)将符号转为可读的星期名称,join拼接成字符串
方案2:重构方法返回结构化对象(更易维护)
如果想避免硬编码索引,让代码可读性更高,可以让to_ice_cube_time返回带属性的对象,比如OpenStruct:
修改模型方法:
require 'ostruct' def to_ice_cube_time # 若实际是多个时间范围,需调整逻辑生成对应数量的OpenStruct对象数组 [ OpenStruct.new( start_time: start_time, end_time: end_time, days: days.compact_blank.keys ) ] end
此时视图即可用属性访问方式:
<% scheduleevent.to_ice_cube_time.each do |timerange| %> <p><%= timerange.start_time %> - <%= timerange.end_time %> (星期:<%= timerange.days.map(&:humanize).join('、') %>)</p> <% end %>
内容的提问来源于stack exchange,提问作者spacerobot
相关产品推荐
相关产品推荐

