問題タブ [rails-activejob]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - 無限ループ用のRails ActiveJob
私が開発しているアプリケーションには、ユーザー入力から完全に分離されたビジネス ロジックを処理するための無限ループが必要です (ユーザーはそれを表示するだけです)。これは従来の MVC からの脱却であるため、Active Job を配置するのが適していると考えました。
ループ内のロジックは、同じネットワーク上のマイクロコントローラーをポーリングします。これらのコードを変更する能力はほとんどないため、使用している独自のプロトコルに適応する必要があります。マイクロコントローラーが応答すると、サーバーはいくつかの計算を行い、データベースに保存する必要があります。
ジョブは、サーバー アプリケーションの起動時に起動されます。そのインスタンスは 1 つだけ存在する必要があるため、モデルやコントローラーに入れたくありません。config フォルダーのいくつかの場所から起動しようとしましたが、初期化された定数 NameError が発生します。
サーバーの初期化時にジョブを起動する正しい方法はどれですか? あなたがとる別のアプローチはありますか?
私は Ruby 2.2.0 と Rails 4.2.0 を使用する webdev 初心者です。
ruby-on-rails - メーラー内で view_context を使用する
私はActiveJob
メールを送信するために使用しています:
使用deliver_now
方法:
請求書_controller.rb
請求書_メーラー.rb
view_context
ここで、コントローラーからメーラーに を送信していることに注意してください。メーラーは、再びそれをInvoicePdf
クラスに渡して請求書を生成します。
結果:メールは正しく送信されました
使用deliver_later
方法:
請求書_controller.rb
結果: ActiveJob::SerializationError in Members::InvoicesController#send_invoice Unsupported argument type:
view_context
。
の内側からロードするか、またはのview_context
内側に を挿入する方法は?InvoicePdf
InvoicePdf
InvoiceMailer
編集:これはInvoicePdfがどのように見えるかです
請求書_pdf.rb
ruby-on-rails - ActiveJob と Sidekiq でメールを送信するときに current_locale を維持するにはどうすればよいですか?
Active_job と sidekiq を使用してメールを非同期で送信しています。しかし、メール送信を実行すると current_locale が失われます。すべてのリクエストの URL パターンによって I18n.locale を設定しました。
以前は、current_locale を保存するためのプラグインを提供する Sidekiq を 使用し、送信時に使用していました。
しかし、私は現在Rails 4.2.1にアップグレードしています.ActiveJobはこのような解決策を提供していないようです.
何か考えはありますか?
私が知っている 1 つの方法は、 current_locale を引数としてメーラーに渡し、次に I18n.with_locale {... } を使用することですが、これは多くの場所を変更します...
ruby-on-rails - ActiveJob と Controller 間でデータを共有する
アプリケーションは n 秒ごとに、トレーディング システム内の証券のライブ価格を提供するリモート JSON ファイルを要求しています。JSON には、必要なデータを含むmarketdata
ブロック ( ) と、現在のデータを含むブロックdataversion
(version
およびseqnum
) があります。
現在、 ActionController::Live
(EventSource
クライアント側で) を使用して、更新されたデータをブラウザーにプッシュしています。すべてのアクションは 1 つのメソッド内で実行されます。
- SSE接続を開く;
- 動的 URL の形成;
- リモート サーバーから新しいデータを取得する。
- 値の比較/再割り当て
seqnum
; - 必要に応じてデータベースを更新します。
したがって、私の目標は、データベースのプルと更新 ( ActiveJob
) と、更新された値のブラウザーへのプッシュ( ) を分離することActionController::Live
です。これを達成するには、次のものが必要です。
- サーバー側のどこかに保存し、コントローラー
seqnum
とversion
バックグラウンドジョブの間で共有します。 - または、フィールドの最新の変更についてデータベースを監視します
updated_at
。
だから基本的に私は2つの質問があります:
- 上記の 2 つのオプションのうち、どちらがより効率的ですか?他に良い方法はありますか?
- (最初のものに存在する権利がある場合)このアプローチをどのように実装しますか?
ruby-on-rails - オブジェクトを ActiveJob エンキューに渡し、そのオブジェクトが実行時に存在しなくなった場合はどうなりますか?
ActiveJob を作成し、実行ブロックが ActiveRecord オブジェクトの単一インスタンスであると予想される引数を受け入れる場合、ジョブがキューに入れられると問題のオブジェクトが存在しますが、実際の実行時にはそのオブジェクトは存在しなくなります。 、仕事は明らかに失敗しますよね?
したがって、ActiveJob が元の ActiveRecord オブジェクトをインスタンス化できないために失敗したこのジョブは、失敗し続けます。失敗のループを止めるために、ジョブに対してどのような更新を行うことができますか。へのフックを検討しましbefore_perform
たが、まだ道が見えていません。
当面の問題を解決する以外に、私がここで学んだもう 1 つのことはwidget_id
、ActiveRecord オブジェクトではなく整数を渡す方がよいということです。その後、実行ブロック内から問題のウィジェットがまだ存在するかどうかを確認できたはずです。
ruby-on-rails - Rails ActiveJob と SSE: API 呼び出しが終了したときにページを更新する方法
SSE を使用して、Stripe サブスクリプションの詳細を表示するページを更新する予定です。
基本的には次のようになります。
- サブスクリプションの詳細ページを読み込む
- ActiveJob ジョブを使用して、Stripe API からサブスクリプションの詳細をリクエストします
- タスクが終了したら、SSE を使用して、そのクライアント (サブスクリプション ページ) にページを更新することを通知します。
- JavaScriptを介して更新を実行します
ステップ 1 と 2 と 4 のコードをセットアップしましたが、#3 の実行方法がわかりません。
私が目にする問題の 1 つは、ActiveJob には実際に after_perform コールバックがありますが、Rails に組み込まれた SSE はコントローラー (ActionController::Live::SSE) に存在することです。after_perform コールバックで SSE コントローラーで何かを行う方法がわかりません。
グーグル、私は潜在的な解決策を見つけました:
- Sidekiq プラグインを使用して、タスクの完了を通知できるようにします。
- PostgreSQL NOTIFY / LISTEN を使用する
SSEコントローラーがタスクが実行されたことをどのように知るかなど、その後どうなるかはわかりません。
その他の注意事項:
バックグラウンド処理に Brandon Hilkert の Sucker Punch gem を使用しています: https://github.com/brandonhilkert/sucker_punch
また、PostgreSQL 専用のコードに固執することを強制しないソリューションも必要です。ただし、それが機能する唯一のアプローチであるかどうかは気にしません。
また、sucker_punch で実行できず、Sidekiq に切り替える必要がある場合に備えて、Sidekiq ソリューションも投稿しました。
何か案は?
ありがとう!
resque - Resque Gem - 適切なキュー データを取得できません
Resque.queues
jsonを使用してすべてのキュー データを取得できない理由は次のとおりです。
名前のみ:
paperclip - delayed_paperclip が sidekiq にヒットしない
遅延ペーパークリップと sidekiq を設定しましたが、写真のアップロードを再試行すると、ログの出力は次のようになります。
これは、Activejob がジョブを実行していることを示しています..sidekiq コンソールの反対側では、ログアウトされているものは何も表示されません..何かが足りないのではないかと思っています。