レールへのリンクは現在のページのパラメータを渡すことができるので

StackOverflow https://stackoverflow.com/questions/2543576

質問

私は追加I18Nマイレールアプリのロケールを使用url params.私のurlはよう http://example.com/en/usershttp://example.com/ar/users (英語-アラビア語ロケールに対す。

私の経路のファイル、私の定義での経路a:path_prefixオプション:

map.resources :users, :path_prefix => '/:locale'

とlocaleが設定されている使用before_filterで定義されApplicationController

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

私も定義されApplicationController#default_url_optionsを追加ロケールすべてのurlが生成される用途

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

ないリンクが追加され、レイアウトのヘッダに表示すべてのページがリンクは同じページが、その他のロケールです。

例えば、私の閲覧にはアラビア語ロケールのような"英語"のリンクをクリック、ヘッダ、リダイレクトピースブリッジなどの見所も私の現在のページに設定のロケールを英語です。があるので、このレール?

役に立ちましたか?

解決

私がこんが、解

link_to 'English', url_for( :locale => 'en' )
link_to 'Deutch', url_for( :locale => 'de' ) 

からのドキュメントはこちら http://api.rubyonrails.org/classes/ActionController/Base.html#M000649

生成時に新しいURLを明 値がすることから、 現在のリクエストに対のパラメータ。のための 例url_for:action=> 'some_action'につきましては現在の コントローラとして期待される。この挙動 広さはその他のパラメータを含む :コントローラのidは、その他の パラメータを設置へ ルートします。

そこで、url_forデフォルトに現在のリクエストのパラメータを変えるだけのつたいおます。この場合に全てを変更したロケールでも宿泊も同じです。

注このため"隠れた":パラメータ。たとえば:

map.my_map ':locale/my_map', :controller => 'home', :action => 'my_map'

上記のurl_for、ページ/ja/my_mapはhomeのurl(ie/ja/home/my_map).ます。

他のヒント

だから私はより明確に(限り)に依存するうちにこれを行う方法は、魔法をレールます。

が見つかり
url_for(params.merge({:your_new_parameter => value}))

これはどのlink_toで動作するはずです。

すべてのは、やっては現在のリクエストのパラメータを取り、それらにあなたの新しい希望ハッシュをマージし、そのための新しいURLを作成されます。

リンクを現在のページの異なるロケール

動作確認はレール4

こんにちは。その後の研究にどうしたらよろしいですか自分で解決します。

link_to 'English', url_for( :locale => 'en' )
link_to 'Deutch', url_for( :locale => 'de' ) 

この作品は、することができ クロスサイト-スクリプティングの脆弱性 だけでパラメータを渡すことができるおURLは以下のように:

http://localhost:3000/en/about?host=www.fishingsiteorbadurl.com/%23&port=80

や最悪の場合:

http://localhost:3000/en/about?host=%D0%BE%D1%87%D0%B5%D0%BD%D1%8C%D0%BF%D0%BB%D0%BE%D1%85%D0%BE%D0%B9%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%84

チェックどのようなUrlを取得しまれたこのリンクをクリックすると、そのお願います。

私の制作のトータルソリューション. 方法を"言語の変更"のリダイレクトページへの適切なロケール用HTTP_REFERERにはrequestオブジェクトになります。ご注意ください:URIです。パス手法のみを取得しパスで、全体のurl

を"言語の変更方法"に任意のコントローラ:

        def change_lang

        if request.referer.nil?
                 refer = root_url
        else
                 uri = URI(request.referer)
                 refer = uri.path
        end
        lang = params[:lang]
        cookies[:locale] = lang
        redirect_to refer

        end

application_controller.rb

before_action :set_locale

def set_locale

# -- Get lang from cookies or url parameter locale

user_locale = cookies[:locale] || params[:locale]

# -- If present

if user_locale.present? 

    # -- If it is has 2 symbols

    user_locale = user_locale.scan(/[a-zA-Z]{2}/) 
else

    # -- If no - use default en locale

    user_locale = 'en'
end


# -- Check, is this locale available for using.
# Please note: this needed for disable invalid locale warning.

if I18n.available_locales.include?(user_locale[0].to_sym)

    I18n.locale =  user_locale[0]
else
    I18n.locale =   "en"
end

end

追加することのできるレイアウト

<%= link_to 'English', change_lang_path('en') %> <%= link_to 'Russian', change_lang_path('ru') %>

config/です。rb

scope "(:locale)", locale: /[a-zA-Z]{2}/ do
get "change_lang/:lang" => "users#change_lang", :as => "change_lang"
end

する必要がない利用params.合併又はモンキ-パッチ。

ということで、私は個人的にいても多くの時間を費やしめます。

あなたはREQUEST_URI解析し、正規表現とパスでロケールを置き換えることができます。

[OK]を、ここではヘルパー例があります。私が正しく目標を理解していれば、

def locale_url(url, locale)
  url.gsub(/\/\w*$/, "/#{locale}")
end

url = "http://www.domain.com/products/1/ru" # or request.request_uri
locale = "en"
locale_url(url, locale) #=> "http://www.domain.com/products/1/en"
あなたが

必要があることを、いくつかの異なるものを作ることができるように

これは、開始点であります

それはDRYと適切なものではないかもしれないが、これを見ているが、私のために完璧に動作します。それはあなたが唯一のロケールを置き換える提供するすべてのパラメータを読み込み EXのURL: http://example.com:3000/us/users?t= 123&M = 343 に等

  def us_link           
        link_to "US", form_locale_url("/us")            
  end

  def jp_link           
    link_to "Japan",form_locale_url("/jp")           
  end              

  def form_locale_url(locale)            
    new_url = request.request_uri          
    new_locale_url = new_us_url = new_jp_url = new_url           
    if new_url == "/"          
      new_locale_url.sub!(/\//,locale)           
    elsif (new_url =~/\/us/) == 0        
      new_us_url.sub!(/\/us/,locale)        
    elsif (new_url =~/\/jp/) == 0          
      new_jp_url.sub!(/\/jp/,locale)       
    end     
  end

Aはるかに高速道 - と便利なあなたが別の場所に変化が...ただ、既存のものに新しいロケールのparamをマージ(そして実際に古いロケールのparamを殺す)ことをアンカータグで混乱を避けることを多くのパラメータを持っている場合ます。

<%= link_to "ру", request.params.merge( locale: 'ru' ) %>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top