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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

JavaScript

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

Q&A

1回答

768閲覧

RailsからJsにサーバー時間を送りたい

takaaa

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

JavaScript

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

0グッド

0クリップ

投稿2021/05/29 11:41

編集2021/05/30 04:08

実装したいこと

Jsでカウントダウン機能を作ったのですが、Jsだとサーバーからの時間が取れないので、どうにかRailsから送れるようにしたいです。

function countdown(){ const now=new Date(); //ここをrailsから取りたい const tomorrow=new Date(now.getFullYear(),now.getMonth(),now.getDate()+1); const differ=tomorrow.getTime()-now.getTime(); const sec=Math.floor(differ/1000)%60; const min=Math.floor(differ/1000/60)%60; const hour=Math.floor(differ/1000/60/60); document.getElementById("hour").textContent=String(hour).padStart(2,"0"); document.getElementById("min").textContent=String(min).padStart(2,"0") document.getElementById("sec").textContent=String(sec).padStart(2,"0") setTimeout(countdown,1000); } countdown();

カウントダウンを出しているviewにTime.currentを置いたのですが、毎秒とることができないので詰まっています。
どなたかご教授お願いします。

## 再修正

// start_timeとcurrent_timeはviewから取っています。 const start_time = new Date(document.getElementById('start_time').dataset.time); const countdown = () => { const current_time = new Date(document.getElementById('current_time').dataset.time); var diff = start_time - current_time; if (diff <= 0) { alert('セール開始です!'); } const diff_sec = Math.floor(diff / 1000) % 60; const diff_min = Math.floor(diff / 1000 / 60) % 60; const diff_hour = Math.floor(diff / 1000 / 60 / 60) % 24; const diff_day = Math.floor(diff / 1000 / 60 / 60 / 24); document.getElementById('min').textContent = String(diff_min).padStart(2, '0'); document.getElementById('sec').textContent = String(diff_sec).padStart(2, '0'); document.getElementById('hour').textContent = String(diff_hour).padStart(2, '0'); document.getElementById('day').textContent = String(diff_day).padStart(2, '0'); diff --; setTimeout(countdown, 1000); } countdown();

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

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

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

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

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

guest

回答1

0

  • Ajaxで取るとか
  • .js.erbで書くとか
  • .html.erbにsrciptタグでとりあえず変数に入れとくとかhiddenのvalueに指定してJavaScriptで得るとか

投稿2021/05/29 11:45

m.ts10806

総合スコア80850

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

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

takaaa

2021/05/29 11:52 編集

ご回答ありがとうございます それらの案は現在時刻を毎秒取れないと思うのですが、どうでしょうか?
m.ts10806

2021/05/29 11:57

質問内容からだと用途が分かりませんが、Ajax案でJavaScript側でsetIntervalとか使って1000ms毎に実行すれば良いのでは。(1000msだとズレる懸念あるのでしたら10msとかでもいいですけど比較面倒ですし) カウントダウンタイマーのようなもので、確実にタイムラグが発生するサーバーサイドの言語を利用するのは悪手だと思います。
takaaa

2021/05/29 11:59

用途としましてはあるページにセール開始場での時間を現在時刻からカウントダウンする感じです(質問内容のコードには明日になっていますが) jsのnew Date()だとデバイスの時間を取っちゃうので、どうにかサーバーから時間を取りたいなと考えているのですが、何か良い方法はないでしょうか?
m.ts10806

2021/05/29 12:42

既に書いた通りです。 しいてなら、画面アクセス時の時間はサーバーから取得し、カウントダウンはその時間から開始でJavaScriptでカウントダウンするとかでしょうか。 結局「開始」されたらボタンなり何なり出てくるでしょうから、その制御は必ずサーバーサイドでするとか。残り時間0になった時にサーバサイドに問い合わせて「開始時間」かどうかチェックするようにすれば、制限できないことはないです。
takaaa

2021/05/30 00:15

ご教授ありがとうございます。 画面アクセス時に現在時間と開示時間を取り、その差を求めて1秒ずつ減らしていくようにしてみましたが、秒数は変わらないままでした。 変更点に現在のコードをあげましたので指摘していただけると幸いです
m.ts10806

2021/05/30 00:26

current_timeを都度更新しないと変わらないままなのは当然かと。
m.ts10806

2021/05/30 00:27

current_time の取得とdiff計算をタイマーの中でやればいいのでは。
takaaa

2021/05/30 03:16

タイマーの中に入れたのですが、やはりできないです。。current_timeの取得が都度やるためにはページ自体を毎秒更新しないといけないと思うのですが、何かいい方法ないでしょうか?
m.ts10806

2021/05/30 03:56

>const current_time = new Date(document.getElementById('current_time').dataset.time); var diff = start_time - current_time; この1セットを if (diff <= 0) { の前に持ってきたわけでないのでしたらこちらの意図した実装になってないと思います。
takaaa

2021/05/30 04:10

再修正したものをアップしました。 こちらでもやはりできないです。
takaaa

2021/05/30 04:14

const current_time = new Date(document.getElementById('current_time').dataset.time); こちらがviewからとっているのでページを開いた時間しか取れていないのが原因なのかとおもいます。current_timeをcountdownの外に出して、diff --;で毎秒減らしてみたのですがこちらもダメでした。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問