2017-10-04 17 views
1

を処理していないしてみてください。ルビーは、私は次の例のRubyコードを持つ例外

color1が渡されなかった場合は、エラー:NoMethodError: undefined method 'to_sym' for nil:NilClassが返されます。

tryメソッドで例外を処理するべきではありませんか?


アップデート:コメントに基づいて...私は三元をすることによってそれを解決:

ExampleClass.new(color1: obj['color1'].present? ? @brand_theme.try(obj['color1'].try(:to_sym)) : nil) 

答えて

2

try@themeオブジェクトで呼び出されます。 obj['color1']がnilを返し、to_symnilで呼び出されるため、nilエラーがスローされます。

あなたはそれをキャッチする

ExampleClass.new(color1: @theme.try(obj['color1'].try(:to_sym) || '')) 

にコードを変更する必要があるだろう。

そしてコードをあらかじめ確認しなければなりません。

どのようにprettificationが動作するかはユースケースによって異なりますので、私は一般的なポインタしか提供できません。一つの方法は、1、代わりにnilの周りを渡すのでavoid having to deal with the null object

にデフォルト値を持っているだろう単にデフォルト値を返します。

color_key = obj.fetch('color') { 'default_color' }.to_sym 
ExampleClass.new(color1: @theme.send(color_key))) 

これはデフォルト値を返す可能fetch methodを使用しています。そうすることで、常に値が定義されます。コメントから

+0

エラー 'TypeError:nilは記号でも文字列でもない' – Cameron

+0

この例では、 'obj ['color1']'はnilになります。だから私たちは試しに何も渡さないだろう。 – Cameron

+0

それでは、参照しているobjがnilのときはどうすれば処理できますか?私がクラスに渡すためにテーマのシンボルとして呼びたいと思っています。 – Cameron

2

In this example obj['color1'] would be nil. So we'd be passing nil to the try.

はい、それは誤りです。名前のないメソッドを呼び出すことはできません。 技術的にはですが、.try(obj['color'].to_s)でエラーを回避できますが、それは非常に間違っています。

私は明示的に存在を確認し、存在しなければ早期に退会します。

def example_method(obj) 
    return unless obj['color1'].present? 

    ExampleClass.new(color1: @theme.try(obj['color1'])) 
end 
+0

私は保釈することはできません。私たちは複数の色を渡します。いくつかは存在しているので、なぜ私たちが最初に試しているのかわからないものもあります。 – Cameron

+0

私は三項を使って修正しました(更新されたOPを見てください)。 – Cameron

+0

@Cameron:うん、これは、example_classを返す必要があるときには本当に良い。そのコードは、prettifiedことができますが、それは動作するはずです。 –

3

あなたはヘルパーメソッドを書くことができます:

def theme_color(name) 
    return unless name 
    return unless @theme.respond_to?(name) 
    @theme.public_send(name) 
end 

def example_method(obj) 
    ExampleClass.new(color1: theme_color(obj['color1'])) 
end 

theme_color戻りnilを引数は、すなわち、obj['color1']nilある場合。また、themeが所定のメソッドに応答しない場合はnilを返します。それ以外の場合は、nameで指定されたメソッドを呼び出します。

respond_to?public_sendには文字列または記号のいずれかを使用できるので、to_symは不要です。

また、あなたの@themeクラスのインスタンスメソッドとしてヘルパーメソッドを定義することができます。

class Theme 
    def color(name) 
    return unless name 
    return unless respond_to?(name) 
    public_send(name) 
    end 

    def red 
    'FF0000' 
    end 
end 

@theme = Theme.new 
@theme.red   #=> "FF0000" 
@theme.color(:red) #=> "FF0000" 
@theme.color('red') #=> "FF0000" 
@theme.color('green') #=> nil 
@theme.color(nil)  #=> nil 

を介して、それを起動します。これらのアプローチは、(使用していることを覚えておいてください

def example_method(obj) 
    ExampleClass.new(color1: @theme.color(obj['color1'])) 
end 

public_sendまたはtry )は、@themeオブジェクトで任意のメソッドを呼び出すことができます。色をハッシュで保つ方が安全かもしれません。

関連する問題