2017-11-30 6 views
1

私はレシピのWebアプリケーションを構築しようとします。これは一種の「ゲーム」です。各ユーザーはレシピを気に入る可能性があります。最初は、これは空に見えます。そして、ユーザーは各時間(または半時間)を間隔、すなわちレシピの各ステップで受け取ることになっています。レールで特定の出版物間の時間間隔を作成するにはどうすればよいですか?

瞬間のために、私はこれらのモデルを持っている:

私は私のステップコントローラで
class Recipe < ApplicationRecord 
belongs_to :user 
has_many :steps 
has_many :favorites 
has_many :favorited_by_users, :through => :favorites, :source => 'user' 

class Step < ApplicationRecord 
belongs_to :recipe 
end 

class Favorite < ApplicationRecord 
belongs_to :recipe 
belongs_to :user 
end 

class User < ApplicationRecord 
has_many :recipes 
has_many :favorites 
has_many :favorite_recipes, :through => :favorites, :source => 'recipe’ 

devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 
end 

def index 
@recipe = Recipe.find(params[:recipe_id]) 
@steps = @recipe.steps 
end 

そして、私は私のインデックスステップビューに表示したいと思います:

ユーザーが気に入ったレシピの各ステップ、遅れて1つずつ(各出版物の間には1mnまたは10mn ...何か設定可能なもの)。ステップの名前を隠してクリックして表示することは可能ですか?その他、各種

#views/steps/index.html.erb 

<h2><%=Recipe.name%></h2> 
<% @steps.each do |step| %> 

<p> <%=step.name%></p> 
#30mn later… the second step 
<p> <%=step.name%></p> 
#30mn later… the third one… 
<p> <%=step.name%></p> 

...

それはどのように可能ですか? cronやActive Jobを使うべきですか?しかし、どうしたらいいですか?

事前に感謝します。 ;)

答えて

2

cronまたはActive Jobはあなたが探しているものではありません。このようなツールはサーバー処理に使用され、タスク内ではクライアント処理が必要です。あなたが本当に必要なのは、ちょうどajax要求をjavascriptを使用して各10mnのサーバに送信し、必要なステップ数で送信することです。

ユーザーが最後のステップを踏んだときに、ステップリクエストを安全にしてサーバー側に保存する必要があることに注意してください。以前にリクエストを受け取った場合は、そのリクエストを拒否するように計画しています(テクニカルユーザーはロジックを調査し、手動でリクエストを送信して詳細な指示を取得できるため、このような保護が必要です)。 :

setInterval(10000, function loadStep() { 
    ajax.get([url], function(stepData) { 
    // Some logic to display your step on the page 
    }) 
}) 

あなたはDOMのすべてのステップをレンダリングすることができ

+0

はあなたに感謝を登録するには問題です! ;)私はこれを試みます;) – Mehdi007

+0

@ Mehdi007あなたは大歓迎です!それはあなたが(将来の検索のために)あなたを助けるなら、私はあなたのコードを有効な応答としてマークすると素晴らしいだろう – AntonTkachov

+0

こんにちは、ちょうど1つの質問は、すべての手順をレンダリングした後、それを表示するjavascriptを実行した後、ページのリロードは、毎回ステップ1から始まりますか? – Mehdi007

0

サーバー側でこのような要求を受け入れ、その後、あなたのステップを表示するにはJavaScriptを実行し、それがことを意味するだろうという、セットアップ適切なルートに忘れてはいけませんページがリロードされるたびに、再度ステップ1から開始します。

進歩を維持したい場合は、レシピとユーザーを参照するテーブルに進度を保存する必要があります。その後

は、それが進歩を確認するようにルールを選択し、定期的なAjaxのクエリは、新たに表示される手順などなど

+0

あなたの応答に感謝!;)私はこれで動作します – Mehdi007

+0

DOMにすべてのステップをレンダリングしている場合、ユーザがこれらのステップに前もってアクセスすることは非常に簡単でしょうか? – SRack

+0

はい、それは本当に重要かどうかわからないので、私はそれをとにかく提案しました。 – nekogami

関連する問題