将"1.hour"转换为1.hour

rub*_*nce 4 ruby ruby-on-rails

是否有可能将"1.hour"字符串转换为1.hour,将"2.hours"转换为2.hours in ruby​​?实际上我从表格的下拉列表中获取此值.我希望Time.now通过这样的方式添加它

time = Time.now + get_method(params[:hours_or_days])
Run Code Online (Sandbox Code Playgroud)

其中params[:days_or_hours]可能是"2.hours"或"1.hour"或"1.day".我想获得这些字符串的方法转换.可能吗?(通过某些方法send)

Jer*_*ten 9

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

我想你应该评估1.hour2.hours等渲染表单时.像这样的东西:

<%= select_tag(:days_or_hours, options_for_select({ "1 hour" => 1.hour, "2 hours" => 2.hours })) %>
Run Code Online (Sandbox Code Playgroud)

这会生成如下HTML:

<select name="days_or_hours">
  <option value="3600">1 hour</option>
  <option value="7200">2 hours</option>
</select>
Run Code Online (Sandbox Code Playgroud)

现在,提交表单时将传递秒数,您不必担心用户是选择了几小时还是几天.你的代码变成了:

time = Time.now + params[:days_or_hours].to_i
Run Code Online (Sandbox Code Playgroud)


Dan*_*ail 5

另一种方法是分割字符串:

>> duration, method = '1.hour'.split('.')
 => ["1", "hour"]
>> duration.to_i.send(method)
 => 3600 seconds
Run Code Online (Sandbox Code Playgroud)

当然,您肯定想以某种方式保护它:

if duration_string =~ /^\d+\.(hour|minute|second)s?$/
   # ...
end
Run Code Online (Sandbox Code Playgroud)