2015-06-30 5 views
12

Я пытаюсь включить трубку в свои рельсы 4 приложения.Rails 4: интеграция You Tube (youtube_it gem)

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

Я использую 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"} %> 

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

<%= 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 

Мой video.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 with You Tube

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

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

Failed to save the new associated video. 

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

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

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

(т.е. удаление:. Наличие: правда и добавление пустой и ноль, но я все еще получаю эту ошибку)

Как я подхожу выяснить это?

ответ

-1

Вы можете использовать драгоценный камень omniauth-google-oauth2 для полной аутентификации с помощью 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" 
    } 

Я надеюсь, он будет решать вам difficultes ...

1

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

A tutorial on the yt gem and why you shouldn't use youtube_it

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

Смежные вопросы