将“1.hour”转换为1.hour

时间:2011-03-09 10:19:29

标签: ruby-on-rails ruby

是否可以将“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

3 个答案:

答案 0 :(得分:9)

您不应该使用eval执行此操作,因为有人使用您的网站可能会发送任何Ruby代码字符串供您执行,这对您的网站来说是一个糟糕的安全漏洞。您可以使用Regexp或白名单来验证字符串,但这样会很麻烦。

我认为您在呈现表单时应该评估1.hour2.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")

编辑: 正如已经多次指出的那样,当你可以这样做时,你不应该这样做。

相关问题