我正在尝试根据星期几生成变量名称。在我的html.erb文件中,我有以下代码:
<%= "@selected_venue.open_time_"+Time.now.strftime('%a').downcase %>
我正在尝试创建一个变量,例如“@ selected_venue.open_time_mon”,“@ selected_venue.open_time_tue”,“@ selected_venue.open_time_wed”等。正如您所看到的,我将附加星期几来通用变量名“@ selected_venue.open_time_”所以我可以得到动态生成的变量的值。
不是获取变量所代表的值(这是一个时间,例如下午2:00),而是继续得到文字结果:“@ selected_venue.open_time_wed”。
是否有一种方法可以用来获取动态生成的变量的值?
答案 0 :(得分:2)
这更像是general ruby thing,但确定它是可能的。您可以像这样访问变量:
@selected_venue.send(:"open_time_#{Time.now.strftime('%a').downcase}")
那就是说,在这样的情况下,我首先考虑是否可以用哈希替换动态变量 - 如果open_time
可以是哈希,如果可以在其上设置:wed
,我个人觉得它更整洁(当然,我不知道这里的全部情况 - 如果你在每个开放时间的场地表中有七个变量,这个解决方案是有意义的)。
答案 1 :(得分:2)
清理将逻辑移动到帮助器,例如:
# in a helper
def open_time
var = "open_time_" + Time.now.strftime('%a').downcase
@selected_venue.send(var)
end
# in the template
<%= open_time %>
我同意@Bubbles的意见,最好在open_time
中拥有像哈希或数组这样的集合,而不是像这样的元程序。
答案 2 :(得分:0)
请注意,如果@selected_venue
是ActiveRecord对象(并且open_time_mon
是该对象的属性),您可以像使用哈希一样使用它:
@selected_venue["open_time_#{Time.now.strftime('%a').downcase}"]
否则,正如其他人所说,你需要使用发送:
@selected_venue.send("open_time_#{Time.now.strftime('%a').downcase}")