7

私には、社会的行動を実行することを目的としたSidekiqワーカーがいます(例:Facebookのページなど)。この一部では、高く評価されているオブジェクトのURLを知っている必要があります。

Rails.application.routes.url_helpers幸い、Rails 3では、パス/ URLヘルパーメソッドへのアクセスが必要なクラスまたはモジュールに含めることで、アプリ固有のルートに簡単にアクセスできます。

私が遭遇している問題は、私のdevelopment.rbまたはでそれらを定義しようとするさまざまな試みにもかかわらず、私のデフォルトのURL/ポートに私のSidekiqワーカー内からアクセスできないことproduction.rbです。

class Facebook::LikeRecipeWorker
  include Sidekiq::Worker
  include Rails.application.routes.url_helpers

  sidekiq_options queue: :facebook

  def perform(recipe_id, user_id)
    recipe = Recipe.find(recipe_id)
    user = User.find(user_id)

    if user.facebook_token
      api = Koala::Facebook::API.new(user.facebook_token)
      api.put_connections 'me', 'my_namespace:like', object: recipe_url(recipe)
    end
  end
end

recipe_urlメソッドがアクセスの場合、ArgumentError次のメッセージが表示されます。

ArgumentError:リンクするホストがありません!:hostパラメーターを指定するか、default_url_options [:host]を設定するか、:only_pathをtrueに設定してください

default_url_options環境固有の構成ファイルに、ActionControllerまたは環境固有の構成ファイルで指定できることを知っていActionMailerます。例:

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
config.action_controller.default_url_options = { host: 'localhost', port: 3000 }

ただし、これらは(当然のことながら)私のSidekiqワーカークラスには影響を与えないようです。default_url_optionsこれらのクラスをどのように定義すればよいですか?

4

2 に答える 2

9

私たちがしたことはこれでした:

構成ファイル(たとえば、config / application.rb、config / product.dbなど)に、デフォルトを設定する行があります。

 routes.default_url_options = { host: 'www.example.org' }
于 2014-04-15T17:23:25.970 に答える
3

少しハックのように感じますが、私はこれに対する潜在的な解決策を見つけました。私は間違いなくより良い答えを受け入れています。

まず、環境ファイル(例:)で、コントローラーconfig/environments/development.rbのを指定します。default_url_options

config.action_controller.default_url_options = { host: 'localhost', port: 3000 }

次に、ワーカークラスで、default_url_optionsインスタンスメソッドを定義します。

class Facebook::LikeRecipeWorker
  # ...

  private

  def default_url_options
    ActionController::Base.default_url_options
  end
end
于 2013-02-17T21:23:42.627 に答える