1

Rails アプリケーションを開発しており、ActiveResource を使用してリクエストを REST サーバーに送信したいと考えています。サーバーの実際の URL サイトは次のとおりです。

http://foo.com/api-v1.0

ポイントは、サーバーへの通信ごとに、Rails アプリケーション コンテキストで現在のロケールを渡したいということです。したがって、有効な URL 呼び出しは次のとおりです。

したがって、私は貧弱な ActiveResource ドキュメントに従っており、リソース クラスを次のように定義しています。

class MyClass < ActiveResource::Base
  self.site = "http://foo.com/api-v1.0/:locale
end

そして、私のアプリケーションコントローラーでは、たとえば、すべての人を取得するときに、次のようなものがあります。

MyClass.all(:params => {:locale => I18n.locale})

これは正常に動作します。

問題は、コントローラーのコードが非常に冗長になることです。:params => {:locale => I18n.locale}アクセスしているすべてのリソースを繰り返し渡す必要があります。

それを避けるために、ActiveResource::Base から派生する基本クラスを作成し、:locale を設定できるようにすべてのリソース アクセス メソッドをオーバーライドすることにしました。したがって、コードは次のようになります。

class MyBaseClass < ActiveResource::Base
  self.site = "http://foo.com/api-v1.0/:locale"

  def self.all
    super(:params => {:locale => I18n.locale})
  end
end

class MyClass < MyBaseClass
end

そして私のアプリケーションコントローラーで:

MyClass.all

で十分です。

ただし、これにより、 は非常に冗長で複雑になりMyBaseClassます。ActiveResource::Basethis を渡すには、 のすべてのメソッドをオーバーライドする必要があります:locale

どうすればより効率的にそれを行うことができますか?

前もって感謝します

パナヨティス

4

2 に答える 2

0

アプリで ActiveResource を使用するすべての場所で常にこの動作が必要な場合: 低レベルのActiveResource::Connection.requestメソッドを上書きして、ロケール文字列を挿入します。

class ActiveResource::Connection
  alias :original_request :request
  def request(method, path, *arguments)
    original_request(method, changed_path, *arguments)
  end
end

それを初期化子に貼り付けます。

文字列の置換はさまざまですが、これはあなたの例ではうまくいきます:

1.9.2p290 :066 >   path = "http://foo.com/api-v1.0/people"
 => "http://foo.com/api-v1.0/people" 
1.9.2p290 :067 > locale = "fr"
 => "fr" 
1.9.2p290 :068 > changed_path = path.sub(/http:\/\/foo.com\/api-v1.0\//, "http://foo.com/api-v1.0/#{locale}/")
 => "http://foo.com/api-v1.0/fr/people" 
于 2012-09-28T16:22:37.857 に答える
0

MyBaseClassから派生したと述べていますActiveResource::Baseが、コードは示していますActiveRecord::Base-おそらく、これはタイプミスです。

アプリケーションのロケールが正しく設定されていることを確認してください。参考までに、私が通常アプリケーション用に I18n をセットアップする方法を以下に示します。

app/controllers/application_controller.rb

before_filter :set_locale

def set_locale
  I18n.locale = params[:locale] || I18n.default_locale
end

def default_url_options(options={})
  {
    :locale => I18n.locale
  }
end

とでconfig/routes.rb

scope "/:locale" do
  # routes
end

次に、コントローラActiveResource::Base.prefixの a を設定します。同じ場所に、または代わりにモデルに設定することもできます。モデル名 (小文字) は、指定されたサイトのリソースとしてデフォルトで使用されます。これらは でオーバーライドできます。これらの各リソース パスのプレフィックスとして使用できます。したがって、アプリ全体で例を実現する1つの方法(ただし、これは代わりに、アプリケーション以外のコントローラーの1つだけである可能性があります)は次のようになります。before_filterActiveResource::Base.siteActiveResource::Base.element_nameActiveResource::Base.prefix

app/controllers/application_controller.rb

before_filter :setup_activeresource

def setup_activeresource
  ActiveResource::Base.site = "http://foo.com/api-v1.0"
  ActiveResource::Base.prefix = "#{I18n.locale}/"
end

実験では、これにより各リクエストのロケールが正しく設定され、正しいリモート リソース (/:locale/ の下にネストされている) に転送されることが示されています。

于 2012-04-27T21:17:34.080 に答える