Rails 4: интеграция You Tube (драгоценный камень youtube_it)

Я пытаюсь включить вас в трубку в моем приложении 4 рельсов.

Я хочу, чтобы пользователи могли загружать видеофайл, который затем будет размещен на моем трубном канале.

Я использую Rails 4 с драгоценным камнем Youtube_it. Я стараюсь следовать этому руководству: http://www.sitepoint.com/youtube-rails/

В моей файловой структуре есть модель проекта и видеомодель. Ассоциации:

Project.rb

has_one :video
  accepts_nested_attributes_for :video

Video.rb

  belongs_to :project

В моей видео таблице есть логический атрибут: include_video.

    <%= f.collection_radio_buttons :include_video, [[true, ' Yes'], [false, ' No']], :first, :last, {:item_wrapper_class => 'fixradio'}, {:class => "radio-inline create-project response-project"} %>

Если это правда, то я хочу показать поле, где пользователи добавляют ссылку на видео (атрибут называется: link).

    <%= f.file_field :link %>

Видео форма, в которой я задаю эти вопросы, является частичной. Частично внутри формы проекта, которая имеет другие вопросы. У меня также есть частичный вид, в котором есть контейнер для вашего зажима для трубки (как показано в учебнике).

Частичная часть просмотра включена в мою страницу показа проекта:

<% if @project.video.include_video? %>

          <%= render 'videos/particulars' %>
    <% end %>

Мой контроллер проекта имеет:

def new
    @project = Project.new
    @project.video = Video.new
end
 def show
    #authorise @project
    @project = Project.find(params[:id])
    @creator = User.find(@project.creator_id)
    @creator_profile = @creator.profile
    @project.video ||= Video.new

  end

Мой контроллер проекта также имеет белые помеченные атрибуты из моей таблицы видео (как и мой видеоконтроллер.

 def project_params
      params.require(:project).permit(
      video_attributes: [:include_video, :link],

Мой видеоконтроллер имеет:

  def show
    respond_with(@video)
  end


 def create

    @video = Video.new(video_params)
    @video.project_id = video_params[:project_id]

  end

   def video_params
      params[:video].permit(:include_video, :link, :project_id)
    end

В моем видео .rb есть:

class Video < ActiveRecord::Base

  # --------------- associations
  belongs_to :project
  belongs_to :program
  belongs_to :proposal
  belongs_to :profile
  belongs_to :user


  # --------------- scopes
  # --------------- validations

  YT_LINK_FORMAT = /\A.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*\z/i

  validates :link, presence: true, format: YT_LINK_FORMAT


  # --------------- class methods

  # --------------- callbacks

  before_create -> do
    uid = link.match(YT_LINK_FORMAT)
    self.uid = uid[2] if uid && uid[2]

    if self.uid.to_s.length != 11
      self.errors.add(:link, 'is invalid.')
      false
    elsif Video.where(uid: self.uid).any?
      self.errors.add(:link, 'is not unique.')
      false
    else
      get_additional_info
    end
  end

  # --------------- instance methods

  # --------------- private methods

  def get_additional_info
    begin
      client = YouTubeIt::OAuth2Client.new(dev_key: ENV['YT_developer_key'])
      video = client.video_by(uid)
      self.title = video.title
      self.duration = parse_duration(video.duration)
      self.author = video.author.name
      self.likes = video.rating.likes
    rescue
      self.title = '' ; self.duration = '00:00:00' ; self.author = '' ; self.likes = 0 ; self.dislikes = 0
    end
  end

  def parse_duration(d)
    hr = (d / 3600).floor
    min = ((d - (hr * 3600)) / 60).floor
    sec = (d - (hr * 3600) - (min * 60)).floor

    hr = '0' + hr.to_s if hr.to_i < 10
    min = '0' + min.to_s if min.to_i < 10
    sec = '0' + sec.to_s if sec.to_i < 10

    hr.to_s + ':' + min.to_s + ':' + sec.to_s
  end
end

У меня возникла проблема, связанная с этим сообщением: Rails 4 с You Tube

Однако это создало новую проблему, и я не знаю, продвигается ли она к решению.

Бит, который новый (из предложения, сделанного пользователем по другому размещенному вопросу), заключается в том, чтобы добавить строку show к моему контроллеру проектов для видео. Когда я пытаюсь это сделать, я получаю эту ошибку:

Failed to save the new associated video.

Когда я пытаюсь создать совершенно новый проект с частичной частью видео, я получаю ошибку, сохраняя форму. Он говорит, что ссылка на видео недействительна (я выбираю файл .mov с моего жесткого диска).

Затем я изменил валидацию в своем видео .rb на:

 validates :link,  format: YT_LINK_FORMAT, :allow_blank => true, :allow_nil => true

(т.е. удаление: наличие: true и добавление пустого и нулевого значения, но я все еще получаю эту ошибку)

Как я могу это понять?

Ответ 1

Я бы не использовал жемчужину youtube_it ruby, потому что он использует v2 API YouTube (который не поддерживается с 20 апреля 2015 года). Я бы предложил использовать yt ruby ​​gem (который использует последнюю версию API YouTube).

Учебник по драгоценному камню yt и почему вы не должны использовать youtube_it

Ваши проблемы скорее всего связаны с попыткой использовать функции youtube_it, которые не поддерживаются API YouTube. Может показаться, что много работы по рефакторингу вашего кода, но я уверен, что это сэкономит вам много головной боли по дороге (тем более, что youtube_it не очень хорошо поддерживается).

Ответ 2

Вы можете использовать omniauth-google-oauth2 gem для полного авторизации с помощью Google.

И в devise.rb:

config.omniauth :google_oauth2, ENV['GP_key'], ENV['GP_secret'],
    {
                  name: 'google',
                  scope: 'plus.login, userinfo.email, userinfo.profile,
                          ...
                          youtube, youtube.readonly, youtubepartner,
                          youtube.upload, youtubepartner, 
                          youtubepartner-channel-audit',
                  prompt: "select_account"
    }

Надеюсь, это решит вам трудности...