質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

1回答

1080閲覧

JavaScriptでPostgreSQLから取得した値をerbに表示したい。

fleatama

総合スコア13

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2020/10/04 06:06

編集2020/10/05 20:55

作っているアプリ

YouTubeのURLを投稿してそれを埋め込み動画として表示し、
YouTubeのプレイリストをサイト上で自作できるようにするアプリをRailsで作っています。

仕様・技術・環境・Gemなど

Ruby '2.6.3'
Rails '5.2.4.1'
使用しているdb: Docker経由でのPostgreSQL

https://qiita.com/Kairi_Yasunnde/items/8e931a4670549ba8237e
https://qiita.com/yuichisan65/items/9356a2822fb37e51b3b4

これらの記事を参考にして動画を投稿しindexページでの一覧表示や
showページで単独で表示させることまでは出来ているのですが、
ここから進んで投稿した動画を組み合わせて
動画を連続再生させる方法が無いか模索しているところです。

プレイリストに関しては動画投稿のためのモデルと
それらに設定しているタグのモデルをリレーションで繋ぐことで管理しています。
登録されたタグをプルダウンメニューで一覧画面に表示し、
そこから選択することで登録されたタグを呼び出してプレイリストのように
動画の一覧を表示出来るようにしています。

動画の連続再生の方法としては
YouTubeのiframe Player APIの中にcuePlaylistというものがあり
このコードの中にYouTubeの末尾の11桁を配列として列挙すれば
擬似的にプレイリストが作れ、連続再生も可能であるということまでは分かりました。

Js

1function onPlayerReady(event) { 2 player.cuePlaylist([ 3 // このようにYouTubeのURLの末尾11桁を配列として列挙するだけでプレイリストを作ることが出来る 4 'BxqYUbNR-c0', 5 '0xSiBpUdW4E' 6 ] 7 ); 8 }

ただしこのやり方だとindexページに手動であらかじめ列記された分しか再生出来ず
htmlのフォーム上から投稿され、それをDBに登録したものを呼び出して再生する、
といったことが出来ません。

Js

1function onPlayerReady(event) { 2 player.cuePlaylist([ 3 '<%= movie.youtube_url %>' 4 ] 5 ); 6 }

現状では上記のようにとりあえず動画を表示させるために一時的に

erb

1<% movie.youtube_url %>

このコードを挿入しているのですが、これだけではindex.html.erbで表示される最初の動画1つだけを延々とループさせることしか出来ません

分からずに困っている点

PostgreSQLに登録したYouTubeの末尾11桁の値をDBのカラムから
JavaScriptに渡してそれをindexに登録した動画の数分まで配列の中で
JavaScriptでループをさせれば実現出来そうだなと思ったのですが、
JavaScriptの勉強があまり出来ておらず実際のコードの書き方をどのようにすれば良いのか
分からない状態で困っています。

実際のコード

該当しそうなコードだけを列挙していますが、
アドバイスをいただく際に不足していそうなコードがあれば指摘していただければ
追記したします。

erb

1<!-- app/views/movies/index.html.erb --> 2 3<p id="notice"><%= notice %></p> 4 5<h1>動画一覧</h1> 6<%= form_tag movies_path, method: :get, class: 'boards__searchForm' do %> 7<%= select_tag :playlist_id, 8 options_from_collection_for_select(Playlist.all, :id, :playlist_name, params[:playlist_id]), 9 { 10 prompt: 'プレイリストをタグで絞り込み検索', 11 onchange: 'submit(this.form);' 12 } 13 %> 14<% end %> 15<br> 16<%= paginate @movies %> 17<div class="container-fluid"> 18 <div class="row"> 19 <% @movies.each do |movie| %> 20 <div class="col-md-6"> 21 <div> 22 <%= movie.title %> 23 <div id="player"> 24 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 25 <script> 26 var tag = document.createElement('script'); 27 tag.src = "https://www.youtube.com/iframe_api"; 28 var firstScriptTag = document.getElementsByTagName('script')[0]; 29 firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 30 31 var player; 32 function onYouTubeIframeAPIReady() { 33 player = new YT.Player('player', { 34 height: '315', 35 width: '560', 36 events: { 37 'onReady': onPlayerReady, 38 'onStateChange': onPlayerStateChange 39 } 40 }); 41 } 42 43 // 該当のコード 44 function onPlayerReady(event) { 45 // JavaScriptでDBから末尾11桁を取得しその値をループさせて配列を作りたい 46 player.cuePlaylist([ 47 '<%= movie.youtube_url %>' 48 ] 49 ); 50 } 51 52 function onPlayerStateChange(event) { 53 console.log(event); 54 } 55 </script> 56 <br> 57 </div> 58 <br> 59 <br> 60 <%= link_to 'Show', movie %> 61 <br> 62 <%= link_to 'Edit', edit_movie_path(movie) %> 63 <br> 64 <%= link_to 'Destroy', movie, method: :delete, data: { confirm: 'Are you sure?' } %> 65 <br> 66 </div> 67 </div> 68 <% end %> 69 </div> 70</div> 71 72<br> 73 74<%= link_to 'New Movie', new_movie_path %> 75<%= paginate @movies %>

Ruby

1# app/controllers/movies_controller.rb 2 3class MoviesController < ApplicationController 4 before_action :set_movie, only: [:show, :edit, :update, :destroy] 5 # before_action :authenticate_user! 6 7 def index 8 @movies = params[:playlist_id].present? ? Playlist.find(params[:playlist_id]).movies.page : Movie.page(params[:page]) 9 end 10 11 def show 12 @movie = Movie.find(params[:id]) 13 end 14 15 def new 16 @movie = Movie.new 17 @movie.playlists.build 18 @movie.movie_playlist_relations.build 19 end 20 21 def edit 22 @movie.playlists.build 23 end 24 25 def create 26 @movie = current_user.movies.build(movie_params) 27 url = params[:movie][:youtube_url] 28 url = url.last(11) 29 @movie.youtube_url = url 30 31 respond_to do |format| 32 if @movie.save 33 format.html { redirect_to @movie, notice: 'Movie was successfully created.' } 34 format.json { render :show, status: :created, location: @movie } 35 else 36 format.html { render :new } 37 format.json { render json: @movie.errors, status: :unprocessable_entity } 38 end 39 end 40 end 41 42 def update 43 @movie.update(update_movie_params) 44 respond_to do |format| 45 if @movie.update(movie_params) 46 format.html { redirect_to @movie, notice: 'Movie was successfully updated.' } 47 format.json { render :show, status: :ok, 48 location: @movie } 49 else 50 format.html { render :edt } 51 format.json { render json: @movie.errors, status: 52 :unprocessable_entity } 53 end 54 end 55 end 56 57 def destroy 58 @movie.destroy 59 respond_to do |format| 60 format.html { redirect_to movies_url, notice: 'Movie was successfully destroyed.' } 61 format.json { head :no_content } 62 end 63 end 64 65 private 66 67 def set_movie 68 @movie = Movie.find(params[:id]) 69 end 70 71 def movie_params 72 params.require(:movie).permit(:title, :youtube_url, playlist_attributes:[:playlist_name], playlist_ids: []) 73 end 74 75 def playlist_params 76 params.require(:playlist).permit(:playlist_name) 77 end 78 79 def update_movie_params 80 params.require(:movie).permit(:title, :youtube_url, playlist_attributes:[:playlist_name], playlist_ids: []) 81 end 82end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「JavaScriptでDBから取得」というのが回答を難しくしている気がします。

やりたいことを実現するには、自分なら
0. サーバーサイドにRubyでAPIを作る(DBの値を取得し、jsonか何かで返させる)
0. クライアントサイドのJavaScriptからAPIをajaxで呼び出す(jsonを受け取る)
0. 受け取ったjsonからJavaScriptで使う配列を作成する

流れになると思います。
http://html2php.starrypages.net/javascript/ajax

自分はPHPメインなので上記がRubyで可能なのかはわかりませんが、ご参考までに。

投稿2020/10/16 04:00

ressentiment

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fleatama

2020/10/16 15:10 編集

ressentimentさん、回答ありがとうございます! 自分はRailsを現在勉強していて作りたい動画アプリを模索する中で JavaScriptが必要になり学び始めたのですが、 Railsもまだしっかりと出来ていない状況だったので JavaScriptについてはどのように扱うべきなのかがいまいち分からない状態でした。 自分でも質問を書き込みながらそもそもDBからJavaScriptに値を渡すという事自体が 一般的な事なのかも分からず自分のやろうとしていることがおかしいかもしれないとは薄々疑問を感じがらも 他の手段が全く思い浮かばずこのような質問をすることになってしまいました。 検索しても似たようなパターンでの参考になる内容も全く出て来なかったので 自分がやろうとしていた事自体が根本的に間違っていたような気がしています。 自分のやり方がおかしいかもしれない?と感じつつも検索する中で JSONでデータを取得する方法が一番現実的で理想的かもしれないとも 思っていたのですが、JSONもまだ扱う機会少なく 具体的な使い方の流れのアドバイス非常に助かりました。 RubyからAPIを扱ったりもまだしたことは無い状態なのですが、 せっかくの機会なので勉強してみたいと思います。 なかなか回答を頂くことが出来ず苦悩していたので、 回答を頂けたのが非常に嬉しいです。 おそらく自分の質問の仕方も良くなかったのだろうと思うので今後また良い質問が出せるように 頑張ります。 改めてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問