2017-01-25 16 views
0

Railsコントローラのアクションでは、Shopify API呼び出しのメソッドを使用しています。以下のようなもの: ShopifyAPI::Product.all()Shopify API呼び出しがRailsのバックグラウンドジョブで機能しない

ShopifyAPI::Product.find(:all, params: {title: title})

ShopifyAPI::Product.create(title: title, body_html: description, images: images, tags: tags, product_type: product_type)

はそれのすべては、私は...は非常にきちんとしたいものを行います。

問題は、CSVをアップロードしてこのコントローラメソッドを使用することです。 8つの広告申込情報がある場合は問題ありませんが、非常に迅速に遅くなります。だから私はそれをバックグラウンドワーカーに移してみましょう。

私はRedis/Resqueを使用してすべての作業を行い、いくつかのダミー出力を使用しています(つまり、puts 'Hi there champ!')。バックグラウンドワーカーが正しく設定され、実行する必要があるときに実行することを確認しました。きちんとした

それで、コントローラの動作のビットと部分を入れて出力します。それは私がShopify APIを呼び出すまで機能します。私は.newと呼ぶことができますが、.find.all、または.createという有効なオブジェクト(バックグラウンドジョブに抽象化する前に動作していました)を試してみると、それはうまくいきません。非常に説明的!私はloggerputs経由で何が起こっている出力を試みたが、私は何が起こっているの多くの出力を生成するように見えることはできませんが、私はShopify APIの仕事にそれを分離している。私はパスワード、サイト、APIキー、秘密などを指定するイニシャライザを持っていても、their setup docs hereのようにShopifyセッションを再初期化する必要があるかもしれないと思っていました。私はそれを間違っていた、またはそれは問題を解決しました。

この時点で私はドキュメントに何か不足していると確信していますが、バックグラウンドジョブからこれらの必要なAPI呼び出しを行う方法を見つけることができません。私が明らかに間違ってやっていることを考えれば、これを解決できるだろうか?誰も同じようなものを扱った?

答えて

0

これは、Shopify Engineがマウントされた場所と関係があります。私のroutes.rbでは、私は(他のルートに加えて、これらは、2適切なものである)は、次のいる:

mount ShopifyApp::Engine, at: '/' 
root to: 'products#index' 

これは、すべての罰金と良いですが、一種のあなたのShopifyのAPIのコンテキストが作られる呼び出しを強制的にproducts.rbインデックスコントローラーアクションのコンテキスト内で...変更を加えることなく。これを行うための2つの方法、それを行うには1つの明らかにもっとRailsy方法:

オプション1:

あなたはShopifyをしたいの任意のファイルの先頭に

session = ShopifyApp::SessionRepository.retrieve(1) 
ShopifyAPI::Base.activate_session(session) 

を含めますAPI呼び出し。これはセッションを設定します(あなたはストアが1つしかないと仮定しますが、これはリトリーブメソッドを使用してストア1を取得しています)、APIを認証して、人生のすべてが良好です。

オプション2:勝利のため

クラス継承。 API呼び出しを行っているすべてのコントローラにShopifyApp::AuthenticatedControllerを継承させます。これにより、イニシャライザが実際に動作します。それだけです。これは、(見返りに)明確で明白な方法です。注文コントローラがありますか? class OrdersController < ShopifyApp::AuthenticatedControllerとdone:order = ShopifyAPI::Order.find(params[:id])はあなたが期待していたものとまったく同じです。

関連する問題