Подсчет количества просмотров видео, отображаемого с использованием активного хранилища - PullRequest
0 голосов
/ 03 марта 2020

Использование active storage Я храню видео в модели урока;

class Lesson
   has_one_attached :video
end

отображается с этим кодом;

<div class='feed'>
  <%= render partial: 'lesson', collection: @lessons, cached: true %>
</div>

, а частичное -;

<% cache lesson do %>
    <div class="video_size">
       <video controls class='video_size'>
          <source src=<%= rails_blob_path(lesson.video) %> type='video/mp4' />
       </video>
     </div>
<% end -%>

Я хотел бы сохранить подсчет частоты каждого видео фактически воспроизводится, т.е. кнопка воспроизведения в видео нажата. Как мне это сделать?

1 Ответ

1 голос
/ 03 марта 2020

По моему мнению, если вы хотите посчитать или сохранить частоту просмотра каждого видео, вы должны настроить отслеживание

ActiveStorage::YourController at 'show' action

Примерно так:

# In app/controllers/active_storage/base_controller.rb
class ActiveStorage::BaseController < ActionController::Base
  before_action :your_implemnt_method!
  include ActiveStorage::SetCurrent

  protect_from_forgery with: :exception
  def your_implemnt_method!
     ## check what the video you want to increment.
     # and increment number of seen in model via direct for queue it to backgroud worker
     content.plus_seen
     # do something more.

  end
end

до couter_cache или увеличить число зрителей, ... et c

Другое решение: вы хотите посчитать количество нажатий кнопки воспроизведения, просто используя javascript обрабатывать событие нажатия, чтобы отправлять ajax запрос к контроллеру увеличить счетчик.

enter image description here

JS код с ручкой воспроизведения

const player = new Plyr('#player');
$('.plyr__control[data-plyr="play"]').click(function() {
  if (!player.source){

    Rails.ajax({
      type: "POST",
      url: "/url-to-do-sth",
      data: {your_data: data-to-sent},
      success: function(repsonse){
      },
      error: function(repsonse){
        console.log(repsonse);
      }
    })
  }
})

А в вашем контроллере:

def handle-sth
  begin
    ## Do sothing
    # and increment number of seen in model via direct for queue it to backgroud worker
    content.plus_seen

    render json: {data: data-to-sent}
  rescue
    render :json => { :errors => ["Error with encode or decode."] }, :status => 422
  end
end
...