如何动态地将YouTube视频嵌入到rails应用中

时间:2013-08-02 06:26:08

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

所以,我有一个rails应用程序,允许用户提交youtube链接并使用赞美宝石对歌曲/链接进行排名。

但是,用户必须将链接物理复制并粘贴到浏览器中才能收听歌曲。为了获得更好的用户体验,我希望将提交的YouTube链接作为视频嵌入到应用中。那么,如何动态完成呢?

换句话说,您可以提交YouTube链接,它将保存在例如: song_id(1)。您可以点击song_id(1),而不只是看到该链接,您还会看到嵌入的YouTube视频。

更新了show.html.erb:

<%- model_class = Song -%>
<div class="page-header">
  <h1><%=t '.title', :default => model_class.model_name.human.titleize %></h1>
</div>

<dl class="dl-horizontal">
  <dt><strong><%= model_class.human_attribute_name(:title) %>:</strong></dt>
  <dd><%= @song.title %></dd>
  <dt><strong><%= model_class.human_attribute_name(:url) %>:</strong></dt>
  <dd><%= YouTubeAddy.extract_video_id(@song.url) %> </dd>


<iframe width="#{width}" height="#{height}" src="http://www.youtube.com/embed/#{youtube_id}" frameborder="0"></iframe>

songhelper.rb

module SongsHelper

  def youtube_id
    YouTubeAddy.extract_video_id(@song.url)
  end

end

3 个答案:

答案 0 :(得分:3)

你可以

  1. 从提交的链接中提取YouTube视频的 ID

    例如,有人提交此链接 http://www.youtube.com/watch?v=XwmtNk_Yb2Q

    你想要XwmtNk_Yb2Q

  2. 使用 id ,您可以呈现嵌入视频的iframe元素。

    <iframe width="#{width}" height="#{height}" src="http://www.youtube.com/embed/#{video_id}" frameborder="0"></iframe>

  3. 这是@Elie Gnrd suggested gem中完成的方式。

答案 1 :(得分:0)

我已经总结了一个要点,并将其归类为一个适当的Ruby类,该类支持youtubevimeo的嵌入URL生成和/或iframe生成。

用法

url = 'https://youtu.be/OaDhY_y8WTo'
generator = VideoEmbedUrlGenerator.new(url)

generator.construct_url
#=> "https://www.youtube.com/embed/OaDhY_y8WTo"

generator.construct_iframe
#=> "<iframe width=\"640\" height=\"480\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen, src='https://www.youtube.com/embed/OaDhY_y8WTo'></iframe>"

实施可以在这里找到:gist

答案 2 :(得分:0)

您可以将youtube视频或vimeo视频的url作为字符串保存在歌曲表内的video列中。因此,要在显示页面中显示视频,您需要将视频嵌入视频ID。假设您有一个歌曲表,其中的视频列正常。最初,在创建歌曲时,用户会添加youtube网址或vimeo网址。太好了,现在您可以在数据库中找到整个字符串。视频网址有很多,例如.be和Feature等。因此最好将它们全部覆盖,并消除错误余地。

使用正则表达式,您需要做一些事情,以检查提供程序并提取ID。因此,您可以转到“助手”,然后在模块中添加以下内容,也可以将其添加到songs_helper。

因此您的application_helper.rb如下所示:

module ApplicationHelper
  def video_embed(video_url)

    # REGEX EXTRACT VIDEO ID
    regex_id = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/|vimeo\.com\/)([a-zA-Z0-9_-]{8,11})/
    match_id = regex_id.match(video_url)
    video_id = ""
    if match_id && !match_id[1].blank?
      video_id = match_id[1]
    end

    # REGEX EXTRACT PROVIDER - YOUTUBE OR VIMEO
    regex_prov = /(youtube|youtu\.be|vimeo)/
    match_prov = regex_prov.match(video_url)
    video_prov = ""
    if match_prov && !match_prov[1].blank?
      video_prov = case match_prov[1]
                     when "youtube"
                       :youtube
                     when "youtu.be"
                       :youtube
                     when "vimeo"
                       :vimeo
      end
    end

    case video_prov
      when :youtube
        "https://www.youtube.com/embed/#{video_id}"
      when :vimeo
        "https://player.vimeo.com/video/#{video_id}"
    end

  end
end

现在在您的视图中。假设songs/show.html.erb您只是调用该方法。

<iframe width="#{width}" height="#{height}" src="<%= video_embed(@song.video) %>" frameborder="0"></iframe>

更好的是,如果您使用引导程序,则可以使用所有令人敬畏的引导程序类,如下所示:

<div class="embed-responsive embed-responsive-16by9">
  <iframe class="embed-responsive-item" src="<%= video_embed(@song.video) %>" allowfullscreen></iframe>
</div>