1
token = params[:token]
email = params[:email]
phone_number = params[:phone_number]
iso_code = params[:iso_code]

if token.nil? or email.nil? or phone_number.nil? or iso_code.nil?
  raise InvalidParameterException
end

token.strip!
email.strip!
phone_number.strip!
iso_code.strip!

#use the variables

私のrailsプロジェクトにはこのコードがたくさんあります。このパターンをRubyonRailsでどのように一般化しますか?
リフレクションとメタプログラミングで可能ですか?

4

5 に答える 5

2
unless [:token, :email, :phone_number, :iso_code].-(params.keys).empty?
  raise InvalidParameterException
end
params.each{|_, v| v.strip!}

params[:token]そして、毎回のように使ってください。paramsたぶん、のような短い変数名を使用できますp

于 2012-11-19T09:26:54.663 に答える
2

この場合、メタプログラミングやパターンは必要ないと思います。常識です。

[:token, :email, :phone_number, :iso_code].each do |k|
  raise InvalidParameterException if params[k].nil?    
  params[k] = params[k].strip
end

このアンチパターンの人気を理解したことはありません。

par_1 = params[:par_1]
...
par_n = params[:par_n]

params[:par_x]代わりに使ってみませんか?通常、ハッシュにグループ化されたparams変数を操作する方が、ローカル変数の束に格納するよりも便利です。

于 2012-11-19T09:29:27.740 に答える
1

以下でメソッドを定義できます。

def verify_presence_define_var_and_strip(params, symbol_list)
  symbol_list.each do |s|
    raise InvalidParameterException if params[s].nil?
    define_method s, params[s].strip
  end
end

このメソッドを使用すると、コードを次のように置き換えることができます。

verify_presence_define_var_and_strip(params, [:token, :email, :phone_number, :iso_code])

メソッドを定義し、ローカル変数を設定するだけでなく、クラスにこの名前のメソッドがまだない場合も同じ結果になることに注意してください。

このメソッドを使用することもinstance_variable_setできますが、変数名の前に。を付ける必要があります@

[アップデート]

メソッド/インスタンス変数ではなくローカル変数を本当に定義したいのであれば、evalを使用する以外の解決策はわかりません:

eval "#{s} = #{params[:s].strip}"

しかし、について検索するとわかるように、これは悪い習慣evalと見なされます。さらに、この場合、URL / POSTパラメータから値を評価します!

于 2012-11-19T09:16:26.417 に答える
0

paramsハッシュにアクセスし、要素を反復処理してnilをチェックし、例外自体をスローするか、例外をスローする可能性のある呼び出し元のメソッドに値を返すヘルパーメソッドを作成します。

このように任意のハッシュを繰り返すことができます。

hash.each do |key,value|
 #example nil check
  if value.nil?
    #do what you want
  end
end
于 2012-11-19T09:10:30.277 に答える
0

パラメータのハッシュでnilを上げたい場合は、次のことができます。

raise InvalidParameterException if params.values.include? nil

特定のパラメータのみを上げたい場合は、最初にそれらのキーに関連付けられている値を選択する必要があります。

required_keys = [:key1, :key2, :key3]
raise invalidParameterException if required_keys.map{|k| params[k]}.include? nil

編集:ポイントが不足しているため答えることができませんが、答えの1つが機能しないと私は信じています:

[:some_key] - {some_key: nil}.keys   # => []

パラメータハッシュに値nilで初期化された1つのキーが含まれている場合(解析の失敗または無効なユーザー入力の結果として)、配列の減算は機能しません。

于 2012-11-19T09:27:49.573 に答える