只在不是零时才执行地图?

时间:2014-01-02 04:40:48

标签: ruby-on-rails ruby ruby-on-rails-4

如果namesnil,则会发生以下中断。如果map不是nil,我怎么能执行self.topics = names.split(",").map do |n| Topic.where(name: n.strip).first_or_create! end 执行?

{{1}}

5 个答案:

答案 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