18

次のルーティング条件で Rails 3.2 アプリケーションに取り組んでいます。

scope "(:locale)", locale: /de|en/ do
  resources :categories, only: [:index, :show]
  get "newest/index", as: :newest
end

私は次のコントローラーを持っています:

class LocaleController < ApplicationController
  def set
    session[:locale_override] = params[:locale]
    redirect_to params[:return_to]
  end
end

私はこれをテンプレートで次のようなものと一緒に使用しています:

 = link_to set_locale_path(locale: :de, return_to: current_path(locale: :de)) do
   = image_tag 'de.png', style: 'vertical-align: middle'
     = t('.languages.german')

current_path現在使用しているルートを推測し、新しいオプションを含むルートに再ルーティングできるなどのヘルパーが Rails に存在しないのはなぜだろうと思っています。

私が抱えている問題は、のようなものを使用していて、ユーザーを(または)redirect_to :backに押し戻すことで、ひどい経験になります。/en/......../de/...

今までセッションにロケールを保存していましたが、これは Google やその他のインデックス サービスでは機能しません。

十分な時間を投資すれば、どのルートが一致したかを検出し、ロケール部分を交換するのに十分なほどスマートなものを手に入れることができると確信していますが、これはハックになると思います.

私はすべての考えを受け入れていますが、このSO の質問は単に使用することを示唆していsub()ます ; 残念ながら、ロケール ショート コードのような短くて頻繁に発生する文字列を使用するのは、おそらくあまり賢明ではありません。

4

2 に答える 2

33

:localeスコープを使用している場合は、次のように使用url_forできますcurrent_path

# Given your page is /en/category/newest with :locale set to 'en' by scope

url_for(:locale => :en) # => /en/category/newest
url_for(:locale => :de) # => /de/kategorie/neueste
于 2012-06-14T13:19:45.777 に答える