Ruby on rails Ruby尝试不处理异常
我有以下示例ruby代码:Ruby on rails Ruby尝试不处理异常,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有以下示例ruby代码: def example_method(obj) ExampleClass.new(color1: @theme.try(obj['color1'].to_sym)) end 它应该将obj['color1']作为符号传递给类,或者将nil传递给类 但是,如果未传递color1,我将得到错误:NoMethodError:undefined方法'to_sym',用于nil:NilClass try方法不应该处理异常吗 更新:根据评论。。。我用三元法解决了这个问
def example_method(obj)
ExampleClass.new(color1: @theme.try(obj['color1'].to_sym))
end
它应该将obj['color1']
作为符号传递给类,或者将nil传递给类
但是,如果未传递color1
,我将得到错误:NoMethodError:undefined方法'to_sym',用于nil:NilClass
try方法不应该处理异常吗
更新:根据评论。。。我用三元法解决了这个问题:
ExampleClass.new(color1: obj['color1'].present? ? @brand_theme.try(obj['color1'].try(:to_sym)) : nil)
对
@theme
对象调用try
。抛出nil错误是因为obj['color1']
返回nil,然后在nil
上调用to\u sym
您必须将代码更改为
ExampleClass.new(color1: @theme.try(obj['color1'].try(:to_sym) || ''))
为了抓住这个机会
然后你必须美化代码
修饰如何工作取决于用例,所以我只能提供一些一般性的指示。一种方法是将默认值设置为
不传递nil,只返回一个默认值:
color_key = obj.fetch('color') { 'default_color' }.to_sym
ExampleClass.new(color1: @theme.send(color_key)))
这利用了,它允许返回默认值。这样,您将始终定义一个值。在
@theme
对象上调用try
。抛出nil错误是因为obj['color1']
返回nil,然后在nil
上调用to\u sym
您必须将代码更改为
ExampleClass.new(color1: @theme.try(obj['color1'].try(:to_sym) || ''))
为了抓住这个机会
然后你必须美化代码
修饰如何工作取决于用例,所以我只能提供一些一般性的指示。一种方法是将默认值设置为
不传递nil,只返回一个默认值:
color_key = obj.fetch('color') { 'default_color' }.to_sym
ExampleClass.new(color1: @theme.send(color_key)))
这利用了,它允许返回默认值。这样,您将始终定义一个值。来自注释:
在本例中,
obj['color1']
将为零。所以我们会把零分传给试球
是的,那是个错误。不能调用没有名称的方法。从技术上讲,您可以通过执行.try(obj['color'].to.\s)
来避免错误,但这绝对是错误的
我会明确检查是否存在,如果不存在,我会提前保释
def example_method(obj)
return unless obj['color1'].present?
ExampleClass.new(color1: @theme.try(obj['color1']))
end
从评论中:
在本例中,
obj['color1']
将为零。所以我们会把零分传给试球
是的,那是个错误。不能调用没有名称的方法。从技术上讲,您可以通过执行.try(obj['color'].to.\s)
来避免错误,但这绝对是错误的
我会明确检查是否存在,如果不存在,我会提前保释
def example_method(obj)
return unless obj['color1'].present?
ExampleClass.new(color1: @theme.try(obj['color1']))
end
您可以编写一个助手方法:
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\u color
如果参数为nil
,即obj['color1']
,则返回nil
。如果theme
没有响应给定的方法,它也会返回nil
。否则,它将调用name
指定的方法
请注意,respond\u to?
和public\u send
接受字符串或符号,因此不需要to\u sym
您还可以将helper方法定义为@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\u send
或try
)允许您在@theme
对象上调用任意方法。将颜色保存在散列中可能更安全。您可以编写一个助手方法:
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\u color
如果参数为nil
,即obj['color1']
,则返回nil
。如果theme
没有响应给定的方法,它也会返回nil
。否则,它将调用name
指定的方法
请注意,respond\u to?
和public\u send
接受字符串或符号,因此不需要to\u sym
您还可以将helper方法定义为@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\u send
或try
)允许您在@theme
对象上调用任意方法。将颜色保留在散列中可能更安全。给出了错误TypeError:nil既不是符号也不是字符串
在本例中obj['color1']
将是nil。所以我们将把nil传递给try。那么当我引用的对象是nil时,我该如何处理呢?但如果是现在,我想把它称为传递给全班同学的主题符号。@Cameron,我提出了一个修饰。我不认为obj
是散列。事实上,我很确定它不是。给我一个错误TypeError:nil既不是符号也不是字符串在这个例子中obj['color1']
将是nil。所以我们将把nil传递给try。那么当我引用的对象是nil时,我该如何处理呢?但如果是现在,我想把它称为传递给全班同学的主题符号。@Cameron,我提出了一个修饰。我不认为obj
是散列。事实上,我很确定不是。我不能保释。我们传递多种颜色。有些存在,有些不存在,因此我们首先尝试。@Cameron:是的,当您必须返回一个示例类时,这确实更好。那个密码可以美化,但应该有用。我不能保释。我们传递多种颜色。有些存在,有些不存在,因此我们首先尝试。@Cameron:是的,当您必须返回一个示例类时,这确实更好。这段代码可以美化,但应该有效。