未定义的方法`split' for nil:Rails中的NilClass

时间:2018-04-02 13:57:30

标签: ruby-on-rails ruby

每当运行此部分代码且值不存在时,我都会收到错误消息undefined method 'split' for nil:NilClass

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

具体来说就是解析这一行。我以为.try会解决它。我甚至使用.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'

2 个答案:

答案 0 :(得分:1)

问题在于:

CGI.parse(uri.query)

uri.querynilparse方法尝试拆分它。

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

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

答案 1 :(得分:0)

完整代码更新了答案。

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

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