2012-04-27 34 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的派生的基類,並覆蓋以這樣的方式,所有資源存取方法,這樣我可以設置:語言環境。因此,代碼變爲:

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::Base的所有方法來通過這個:locale

任何線索我怎麼能更有效地做到這一點?

在此先感謝

Panayotis

回答

0

你提到MyBaseClassActiveResource::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 

然後,在before_filter用於設置ActiveResource::Base.prefix控制器。 ActiveResource::Base.site也可以設置在同一個地方,或者在模型上。模型名稱(小寫)默認用作指定站點的資源;這些可以用ActiveResource::Base.element_name覆蓋。可以使用ActiveResource::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 /下)。

+0

感謝您的錯字校正。不可以。您的解決方案無法正常工作,因爲它只設置一次網站。 '''self.site =「...'''每次請求被髮送到遠程資源(REST)服務器時都不會被調用 – 2012-04-30 06:21:48

+0

啊,我明白了 - 當然,我建議只設置一次。已經糾正了我的上述帖子。 – tiredpixel 2012-05-01 00:30:13

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"