Ruby on rails Rails中nil:NilClass的未定义方法“split”

Ruby on rails Rails中nil:NilClass的未定义方法“split”,ruby-on-rails,ruby,Ruby On Rails,Ruby,每当运行这段代码且值不存在时,我总是收到nil:NilClass的错误消息undefined method'split': module VideosHelper def youtube_embed(url, **kwargs) uri = URI('//www.youtube.com/embed/') uri.path += find_youtube_id(url).join("','") options = { src: uri.to_s, width: '10

每当运行这段代码且值不存在时,我总是收到nil:NilClass的错误消息undefined method'split':

module VideosHelper
 def youtube_embed(url, **kwargs)
  uri = URI('//www.youtube.com/embed/')
  uri.path += find_youtube_id(url).join("','")
  options = {
    src: uri.to_s,
    width: '100%',
    height: '350px',
    frameborder: 0,
    allowfullscreen: true
  }
  content_tag(:iframe, nil, options.merge(kwargs), false)
end

def find_youtube_id(url)
  uri = URI(url)
  CGI.parse(uri.query).try(:[], 'v')
rescue URI::InvalidURIError
  nil
end
end
这是带有parse的行。我想,试试就能解决它。我甚至使用了.fetch而不是.try,但同样的问题仍然存在

编辑:此文件包含辅助文件的完整代码。最初在find_youtube_id方法中,我实际上在营救后只有零,并且正在处理它

这是我航站楼里的东西

.container.video-section
 .row.video-group
  .col-md-8
    - unless @region.youtube_url.nil?
     = youtube_embed(@region.youtube_url)
  .col-md-3.offset-md-1.sales-group.text-center
    .manager-single
      = image_tag @region.staff_photo.url, class: 'img-fluid'
app/helpers/videos_helper.rb:17:in `find_youtube_id'
app/helpers/videos_helper.rb:4:in `youtube_embed'
app/views/regions/show.html.slim:74:in `block in _ 
app_views_regions_show_html_slim__295776519867909611_70169935841560'
app/views/regions/show.html.slim:5:in `_ 
app_views_regions_show_html_slim__295776519867909611_70169935841560'
app/controllers/regions_controller.rb:14:in `show'
问题在于:

CGI.parse(uri.query)
query为nil,解析方法尝试拆分它

如果要在值不存在时返回nil,请将该行替换为:

CGI.parse(uri.query).try(:[], 'v') if uri.query

完整的代码更新了答案

module VideosHelper
 def youtube_embed(url, **kwargs)
   uri = URI('//www.youtube.com/embed/')
   uri.path += find_youtube_id(url).join("','") if uri.query
   options = {
     src: uri.to_s,
     width: '100%',
     height: '350px',
     frameborder: 0,
     allowfullscreen: true
   }
   content_tag(:iframe, nil, options.merge(kwargs), false)
 end

 def find_youtube_id(url)
   uri = URI(url)
   CGI.parse(uri.query).try(:[], 'v') if uri.query
 rescue URI::InvalidURIError
   nil
 end
end

当将if uri.query应用到CGI.parse的末尾时,它解决了拆分问题,但在uri.path上出现了一个问题,因此重复了答案

显示堆栈跟踪。url和uri.query的值。而且,这个异常处理程序很奇怪。不确定您希望用它实现什么。嗯,stacktrace的第一行不在CGI.parse或更深层?有趣的无论如何,问题似乎在于@region.youtube\u url中的坏数据。它有什么价值?这不是一个真正的Ruby问题。这是一个确定当URL丢失时您希望发生什么的问题。实际上,相同的响应。实际上,我们正准备尝试类似的操作。由于OP显然不知道如何处理nil,因此从这里返回nil只会使问题远离根本原因。