【问题标题】:Check if text input is empty if so dont convert to float检查文本输入是否为空,如果是,则不要转换为浮点数
【发布时间】:2013-03-25 22:36:04
【问题描述】:

我正在使用 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 值,您想从空输入中得到什么?
  • 好吧,我猜是 nil,那么我希望 Datamapper 能够接受这一点,因为它有一个存在验证。所以我希望 ti 会抛出错误。
  • :amount => params[:amount].to_s.empty? ? nil : params[:amount].to_f, 应该是有意义的。 to_s 消除了对 nil 值的测试,因为 nil.to_s 产生空字符串。

标签: ruby validation methods sinatra


【解决方案1】:

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

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

例如,当params[:amount] 为空时返回nil

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 或引发异常。选择主要是风格。

【讨论】:

    【解决方案2】:

    这是一种更 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 轻松测试

    【讨论】:

      【解决方案3】:
      x = '' => ""
      x.to_f unless x.empty? => nil
      x = '1' => "1"
      x.to_f unless x.empty? => 1.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-08
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        相关资源
        最近更新 更多