1

私はsinatraを使用して小さなルビーアプリを作成しており、入力用のテキスト入力があり、この.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

2つの基本的なオプションがあります。1つ目は、三項演算子を使用し、文字列が空の場合にデフォルト値を指定することです。基本的なテンプレートは次のとおりです。

(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
)

2つ目は、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の方法ですが、パラメーターの検証は非常に一般的な方法であるため、機能を1か所で定義して再利用するのに役立ちます。

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 に答える