是否可以将“1.hour”字符串转换为1.hour,将“2.hours”转换为2.hours in ruby?实际上我从表格的下拉列表中获取此值。我希望通过类似的内容将其添加到Time.now
time = Time.now + get_method(params[:hours_or_days])
其中params[:days_or_hours]
可能是“2.hours”或“1.hour”或“1.day”。我想获得这些字符串的方法转换。可能吗? (通过某种方法,如send
)
答案 0 :(得分:9)
您不应该使用eval
执行此操作,因为有人使用您的网站可能会发送任何Ruby代码字符串供您执行,这对您的网站来说是一个糟糕的安全漏洞。您可以使用Regexp或白名单来验证字符串,但这样会很麻烦。
我认为您在呈现表单时应该评估1.hour
和2.hours
等等。像这样:
<%= select_tag(:days_or_hours, options_for_select({ "1 hour" => 1.hour, "2 hours" => 2.hours })) %>
这会生成如下HTML:
<select name="days_or_hours">
<option value="3600">1 hour</option>
<option value="7200">2 hours</option>
</select>
现在提交表单时将传递秒数,您无需担心用户是选择了几小时还是几天。你的代码变成了:
time = Time.now + params[:days_or_hours].to_i
答案 1 :(得分:3)
另一种方法是拆分字符串:
>> duration, method = '1.hour'.split('.')
=> ["1", "hour"]
>> duration.to_i.send(method)
=> 3600 seconds
当然,你肯定想以某种方式保护它:
if duration_string =~ /^\d+\.(hour|minute|second)s?$/
# ...
end
答案 2 :(得分:-2)
您可以使用eval
关键字执行此操作。
e.g。 Time.now + eval("1.hour")
编辑: 正如已经多次指出的那样,当你可以这样做时,你不应该这样做。