2012-12-08 97 views
0

我試圖用這個寶石來確定用戶的首選語言HTTP_ACCEPT_LANGUAGE寶石,並運行了一些麻煩。使用在軌道3

undefined local variable or method http_accept_language for #<HomeController:0x964f5ec> 

我包含在Gemfile中的寶石,跑捆綁安裝,並多次重新啓動服務器。爲什麼我的應用不能識別寶石?

而且,在我的ApplicationController中我寫了下面的方法:

def set_i18n_locale 
http_accept_language.user_preferred_languages 
available = %w{en kr} 
params[:locale] = http_accept_language.preferred_language_from(available) 
    if params[:locale] 
     I18n.locale = params[:locale] 
    end 
end 

有一件事我不明白的是第二行, http_accept_language.user_preferred_languages

https://github.com/iain/http_accept_language,這應該返回一個排序陣列。我想我必須將數組存儲到某個變量中並使用它,但作者只是拋出這樣的方法。這是如何運作的?我不能只做以下嗎?

available = %w{en kr} 
params[:locale] = http_accept_language.language_region_compatible_from(available) 

我對作者的解釋有點困惑。

謝謝你的幫助。

UPDATE: 寶石,HTTP_ACCEPT_LANGUAGE,似乎並沒有被成功安裝。它位於gem列表中,但是當我嘗試卸載它時,錯誤消息顯示它未安裝。爲什麼會發生?

[email protected]:~/appe$ gem list 

*** LOCAL GEMS *** 
... 
http_accept_language (1.0.2) 
... 

[email protected]:~/app$ sudo gem uninstall http_accept_language 
INFO: gem "http_accept_language" is not installed 
+0

我無法弄清楚你正在使用的平臺,但我認爲你沒有問題安裝它,我想你「sudo的創業板」訪問不同的紅寶石。 – michelpm

+0

還有一件事,你問兩兩件事,就可以使問題更具有可讀性,如果你只是刪除一切從「而且,」到「UPDATE」。我很肯定你可以弄清楚在主要問題解決後你想要問什麼。 – michelpm

回答

1

我不必使用gem來實現我想要的功能。

def set_i18n_locale 
    unless params[:locale] 
     params[:locale] = extract_locale_from_accept_language_header 
    end 
    available = ['en', 'kr'] 
    if available.include? params[:locale] 
     I18n.locale = params[:locale] 
    end 
    end 

    def extract_locale_from_accept_language_header 
    request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first 
    end 

    def default_url_options 
    { :locale => I18n.locale } 
    end 

Official GuideAgile Development幫了不少忙。

+0

這段代碼做了如此有影響力的材料是一件壞事,它是窮人的內容談判。 – michelpm

+1

只有當用戶的瀏覽器首選語言爲'en'或'kr'時,您的代碼纔是準確的。如果用戶首選語言與您的可用語言不匹配,那麼您需要指定一個默認語言環境以備後用。 對您的原始問題的具體答案, 由於@michelpm已經提到。您需要在您的Gemfile中指定'gem'http_accept_language','〜2.0.0.pre''。 – TheMouseMan

2

嘗試使用request.user_preferred_languages代替http_accept_language.user_preferred_languages

+0

這也行不通。 – michelpm

2

the documentation states從2.0版開始,gem是Rack中間件,但問題是the only 2.0 version released in June 2012only a pre-release。因此,要獲得版本2.0,你需要這樣做:

gem 'http_accept_language', '~> 2.0.0.pre' 
+0

該解決方案對我有幫助,但是當Rails在更改完成後重新加載應用程序時,問題再次出現。 Rails 3.2.13,ruby 2.0.0-p195,Development env。順便說一下,我發現這裏適合我的解決方案:https://github.com/iain/http_accept_language/pull/19 – vogdb

0

至於我的解決方案是從github應用@DouweM公關。下面是從的Gemfile行:

gem 'http_accept_language', :git => 'https://github.com/DouweM/http_accept_language', :branch => 'no-middleware-no-crash' 
0

把你的Gemfile:

gem 'http_accept_language', '~> 2.0.0.pre' 

,然後在代碼中使用ENV又名:

env.http_accept_language 

爲我工作。

% bundle show|grep acc 
    * http_accept_language (2.0.0.pre)