1

我正在使用 sinatra 编写一个小型 ruby​​ 应用程序,并有一个文本输入作为输入,然后我使用该.to_f方法将其转换为平面。但是,如果输入为空,则.to_f仍会将空字符串转换为 0 值。

我希望对其进行检查,因此如果输入为空白/空,它不会尝试将其转换为数字。下面是我到目前为止的代码,我尝试添加.empty?到末尾,但它会引发方法错误。

weight = Weight.create(
    :amount => params[:amount].to_f,
    :user_id => current_user.id,
    :created_at => Time.now
)
4

3 回答 3

4

你有两个基本的选择。第一种是使用三元运算符,当字符串为空时给出一个默认值。基本模板是:

(params[:amount].empty?) ? <EMPTY EXPRESSION> : <NOT EMPTY EXPRESSION>

例如,nilparams[:amount]为空时返回:

weight = Weight.create(
    :amount => (params[:amount].empty?) ? nil : params[:amount].to_f,
    :user_id => current_user.id,
    :created_at => Time.now
)

二是使用Ruby的逻辑运算符。基本模板是:

params[:amount].empty? && <EMPTY EXPRESSION> || <NOT EMPTY EXPRESSION>

例如,在params[:amount]为空时引发异常:

weight = Weight.create(
    :amount => params[:amount].empty? && \
        (raise ArgumentError.new('Bad :amount')) || params[:amount].to_f
    :user_id => current_user.id,
    :created_at => Time.now
)

两种方式都可以返回nil或引发异常。选择主要是风格。

于 2013-03-25T13:19:27.933 回答
0

这是一种比严格必要的更 Java/EE 的做事方式,但我发现参数验证是如此普遍,它有助于在一个地方定义功能,然后重用它。

class ParamsExtractor
  def get_float_parameter(params,key)
    params[key] && !(params[key].nil? || params[key].to_s.strip == '') ? params[key].to_f : 0.0
  end
end

weight = Weight.create(
  :amount => ParamsExtractor.get_float_parameter(params, :amount),
  :user_id => current_user.id,
  :created_at => Time.now
)

您可以做其他事情(模块等),但这很清楚并且可以通过 RSpec 轻松测试

于 2013-03-25T13:07:32.853 回答
0
x = '' => ""
x.to_f unless x.empty? => nil
x = '1' => "1"
x.to_f unless x.empty? => 1.0
于 2013-03-25T13:15:36.540 回答