Ruby on rails 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方法不应该处理异常吗 更新:根据评论。。。我用三元法解决了这个问

我有以下示例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方法不应该处理异常吗


更新:根据评论。。。我用三元法解决了这个问题:

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:是的,当您必须返回一个示例类时,这确实更好。这段代码可以美化,但应该有效。