2012-04-27 4 views
1

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

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

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

e.t.c.

だから、私は貧しい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には多くの冗長と複雑さがあります。この:localeを渡すには、ActiveResource::Baseのすべてのメソッドをオーバーライドする必要があります。

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

おかげ

Panayotis

答えて

0

あなたはMyBaseClassActiveResource::Baseから派生しますが、コードはActiveRecord::Baseを示していることに言及 - おそらく、これはタイプミスです。

アプリケーションのロケールが正しく設定されていることを確認してください。 、

scope "/:locale" do 
    # routes 
end 

次にためbefore_filterActiveResource::Base.prefixを設定します。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中の場合には、それはここで私は通常、アプリケーションのための国際化を設定する方法です、あなたに便利ですコントローラ。 ActiveResource::Base.siteは、同じ場所に設定することも、モデルに設定することもできます。モデル名(小文字)は、指定されたサイトのリソースとしてデフォルトで使用されます。これらは、ActiveResource::Base.element_nameで上書きすることができます。 ActiveResource::Base.prefixを使用して、これらのリソースパスのそれぞれに接頭辞を付けることができます。したがって、1つの全体のアプリ間であなたの例を達成する方法、(しかし、これだけではなく、一つの非アプリケーションコントローラかもしれないが)のようになります。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 

実験は、これはロケールを設定していることを示し適切なリモートリソース(/:ロケール/の下にネストされています)に指示するだけでなく、各要求に対して正しく実行されます。

+0

感謝を。あなたの解決策は機能していません。サイトを一度設定するからです。 '' 'self.site =" ... '' 'はリクエストがリモートリソース(REST)サーバーに送られるたびに呼び出されません。 –

+0

ああ、もちろん、私が示唆したものは一度しか設定されていません。上記の投稿を修正しました。 – tiredpixel

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" 
関連する問題