在rails on rails中创建动态变量

时间:2013-12-05 01:57:05

标签: ruby-on-rails ruby variables dynamic

我正在尝试根据星期几生成变量名称。在我的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”。

是否有一种方法可以用来获取动态生成的变量的值?

3 个答案:

答案 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}")