Ruby on rails 在RubyonRails中创建动态变量
我试图根据星期几生成一个变量名。在我的html.erb文件中,我有以下代码:Ruby on rails 在RubyonRails中创建动态变量,ruby-on-rails,ruby,variables,dynamic,Ruby On Rails,Ruby,Variables,Dynamic,我试图根据星期几生成一个变量名。在我的html.erb文件中,我有以下代码: <%= "@selected_venue.open_time_"+Time.now.strftime('%a').downcase %> 我正在尝试创建一个变量,如“@selected_-vinge.open_-time_-mon”、“@selected_-vinge.open_-time_-tue”、“@selected_-vinge.open_-time_-wed”等。正如您所看到的,我在通用变量
<%= "@selected_venue.open_time_"+Time.now.strftime('%a').downcase %>
我正在尝试创建一个变量,如“@selected_-vinge.open_-time_-mon”、“@selected_-vinge.open_-time_-tue”、“@selected_-vinge.open_-time_-wed”等。正如您所看到的,我在通用变量名“@selected_-vinge.open_-time_-time”后面加上了一周中的一天,以便获得动态生成的变量的值
我没有得到变量所表示的值(如2:00PM),而是一直得到文字结果:“@selected\u-vention.open\u-time\u-wed”
是否有一种方法可以用来获取动态生成的变量的值?这更像是一种方法,但肯定是可能的。您可以这样访问变量:
@selected_venue.send(:"open_time_#{Time.now.strftime('%a').downcase}")
这样说,在这样的情况下,我首先考虑是否可以用哈希替换动态变量——如果<代码> OpenStime可以是哈希,如果你可以在上面设置<代码>:WEW <代码>,我个人会发现它更简洁。(当然,我不知道这里的全部情况-如果您在场馆表中有七个变量用于每天的开放时间,这个解决方案是有意义的)。
这更像是一个问题,但肯定是有可能的。您可以访问这样的变量:@selected_venue.send(:"open_time_#{Time.now.strftime('%a').downcase}")
这样说,在这样的情况下,我首先考虑是否可以用哈希替换动态变量——如果<代码> OpenStime可以是哈希,如果你可以在上面设置<代码>:WEW <代码>,我个人会发现它更简洁。(当然,我不知道这里的全部情况-如果您在每日开放时间的场馆表中有七个变量,这个解决方案是有意义的)。
Cleaner将逻辑移动到助手,例如:# in a helper
def open_time
var = "open_time_" + Time.now.strftime('%a').downcase
@selected_venue.send(var)
end
# in the template
<%= open_time %>
助手中的#
def打开时间
var=“open\u time”+time.now.strftime(“%a”).downcase
@所选地点。发送(var)
结束
#在模板中
我同意@Bubbles的观点,在
open\u time
中有一个散列或数组这样的集合比这样的元程序要好。Cleaner将逻辑移动到帮助程序,例如:
# in a helper
def open_time
var = "open_time_" + Time.now.strftime('%a').downcase
@selected_venue.send(var)
end
# in the template
<%= open_time %>
助手中的#
def打开时间
var=“open\u time”+time.now.strftime(“%a”).downcase
@所选地点。发送(var)
结束
#在模板中
我同意@Bubbles的观点,在
open\u time
中有一个散列或数组这样的集合比这样的元程序要好。请注意,如果@selected\u vention
是一个ActiveRecord对象(并且open\u time\u mon
是该对象的一个属性),您可以像散列一样使用它:
@selected_venue["open_time_#{Time.now.strftime('%a').downcase}"]
否则,正如其他人所说,您需要使用send:
@selected_venue.send("open_time_#{Time.now.strftime('%a').downcase}")
请注意,如果
@selected\u-vinge
是一个ActiveRecord对象(而open\u-time\u-mon
是该对象的一个属性),则可以像散列一样使用它:
@selected_venue["open_time_#{Time.now.strftime('%a').downcase}"]
否则,正如其他人所说,您需要使用send:
@selected_venue.send("open_time_#{Time.now.strftime('%a').downcase}")
谢谢,Bubbles。你的答案很有效,但我还是同意Mori下面的答案,因为它允许我在helper中插入一些额外的代码。干杯!很公平;提取代码有很多话要说。谢谢,Bubbles。你的答案很有效,但我同意Mori下面的答案,因为它允许我在hel中插入一些额外的代码per.干杯!很公平;关于提取代码有很多话要说。Mori-我最终将open_time方法放入了一个helper中,效果很好;但是,我现在通过AJAX在我的控制器中调用show action,应用程序不再识别open_time方法。您对如何访问helper methods v有什么建议吗ia AJAX?@Vee,helper方法应该具有相同的作用域,无论是否由AJAX调用。如果AJAX使用不同的控制器,您需要确保helper在那里也是可见的,例如,通过指令。您说得对,Mori!在修改了大量代码后,我忘记了重命名helper中的实例变量。同样,这是有效的非常有魅力。谢谢!Mori-我最终将open_time方法放入助手中,效果非常好;但是,我现在通过AJAX在我的控制器中调用show操作,应用程序不再识别open_time方法。您对如何通过AJAX访问助手方法有何建议?@Vee,助手方法应该具有相同的功能范围,无论是否由AJAX调用。如果AJAX使用不同的控制器,您需要确保助手在那里也是可见的,例如,通过指令。您说得对,Mori!在修改了大量代码后,我忘了重命名助手中的实例变量。同样,它非常有效。谢谢!