我正在使用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
)
答案 0 :(得分:3)
您有两个基本选项。第一种是使用三元运算符,并在字符串为空时给出默认值。基本模板是:
(params[:amount].empty?) ? <EMPTY EXPRESSION> : <NOT EMPTY EXPRESSION>
例如,要在nil
为空时返回params[: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
或引发异常。选择主要是风格。
答案 1 :(得分: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明确且易于测试
答案 2 :(得分:0)
x = '' => ""
x.to_f unless x.empty? => nil
x = '1' => "1"
x.to_f unless x.empty? => 1.0