2016-05-24 12 views
1

Rails以外のパラメータの検証を試しています。変数名へのアクセス

def create_statement(action, ...) 
    valid_one_of(action, ['ADD', 'MOVE', 'DELETE']) 
    ... 
end 

検証メソッド:

def valid_one_of(input, valid_values) 
    return true if valid_values.include?(input) 
    raise "#{input} was not a valid value for #{input.var_name}" 
end 

サンプルコール:

create_statement('Bob') 

ので、出力は次のようになります。私はinput.var_nameを得るのですか

Bob was not valid value for action

問題?


は私の回避策のために私は

valid_one_of(action, ['ADD', 'MOVE', 'DELETE'], 'action') 

(と私の出力のための第三PARMを使用)が、いないようです、これは感じて少し冗長を渡すことができます。

変数名にアクセスできない場合は、この回避策よりもDRYコーディングスタイルがありますか?

答えて

0

私はローカル変数の名前を取得する方法がわかりませんし、可能であればどの名前を使用したいのですか?メソッド定義で定義されているパラメータの名前?呼び出し元の変数の名前?

あなたの「回避策」は恐ろしいとは思わないが、ちょっと読んだほうが少し変わったと思う。

また、コールサイトで有効な値のリストを実際に渡すかどうかわからない場合や、渡した型を使用して検索する有効な値のハッシュからの有効な値。

def valid_one_of_type type, input:, valid_values: 
    return true if valid_values.include?(input) 
    raise "#{input} was not a valid value for #{type}" 
end 

my_action = "bob" 

valid_one_of_type :action , input: my_action, valid_values: ['ADD', 'MOVE', 'DELETE'] 

def valid_one_of_type type, input, valid_values 
    return true if valid_values.include?(input) 
    raise "#{input} was not a valid value for #{type}" 
end 

my_action = "bob" 

valid_one_of_type :action , my_action, ['ADD', 'MOVE', 'DELETE'] 

別のオプションは、クラスにあなたの行動をラップし、作成時に検証を行うには、次のようになります。

class Action 
    VALID_ACTIONS = ['ADD', 'MOVE', 'DELETE'] 
    def initialize action 
    unless VALID_ACTIONS.include? action 
     raise "#{action} is not a valid value for #{self.class.name}" 
    end 
    end 
end 

my_action = Action.new "bob" 
+0

私は、呼び出し元(この場合、「アクション」は「は、入力中の名前を望みます') 私はもっと軽い解決策を選び、私の各パラメータのクラスを作成したいと思います。この場合、6つのparmsを検証したいと思います。新しいクラスを作成すると、コードの主な意図から気をそらすと思います。 - アイデアありがとう – Nathan

関連する問題