如果names
为nil
,则会发生以下中断。如果map
不是nil
,我怎么能执行self.topics = names.split(",").map do |n|
Topic.where(name: n.strip).first_or_create!
end
执行?
{{1}}
答案 0 :(得分:8)
其他几个选项:
选项1(在执行split
时检查map
的结果):
names_list = names.try(:split, ",")
self.topics = names_list.map do |n|
Topic.where(name: n.strip).first_or_create!
end if names_list
选项2(使用try
,这将防止错误):
self.topics = names.try(:split, ",").try(:map) do |n|
Topic.where(name: n.strip).first_or_create!
end
答案 1 :(得分:1)
如果topics
实际为零,则取决于您希望names
成为什么。最优雅的解决方案可能是替换names
为零的空字符串:
self.topics = (names || '').split(",").map do |n|
...
但是这会为topics
分配一个空数组。如果那不是你想要的,你可以用这样的nil
检查来包装它:
if names
self.topics = ...
end
或者像这样:
self.topics = names.split(",").map do |n|
...
end if names
答案 2 :(得分:1)
nil.to_s
为""
,请尝试
names.to_s.split(",").map
答案 3 :(得分:0)
我认为真正的问题是你没有检查是否可以安全地执行操作,然后在不安全的情况下不得不争先恐后地尝试恢复。
相反,在尝试names
之前,请检查split
是否有效。如果self.topics
为零,则不说names
应该是什么,但我会从以下内容开始:
self.topics = if names.nil?
# whatever self.topic should be if names == nil
else
names.split(",").map do |n|
Topic.where(name: n.strip).first_or_create!
end
end
答案 4 :(得分:0)
从ruby 2.3.0开始,您可以使用安全导航操作符(&.
):
self.topics = names&.split(",").map do |n|
Topic.where(name: n.strip).first_or_create!
end