7

私はRailsアプリに国際化を追加する過程にあり、多かれ少なかれ関連するRailsガイドRailscastをフォローしています。

私は2つの問題に遭遇しました:

  1. 現在のロケールにリダイレクトする「ホーム」リンクを追加するにはどうすればよいですか。現在、root_pathリンクがありますが、スコープ外のルートを取得するように設計されたroutes.rbの行が原因で、これらは失敗しています。これは、root_pathが現在のロケールではなく、常にデフォルトのロケールにリダイレクトすることを意味します。
  2. すべてをローカルでセットアップして動作させていますが(上記の問題を除く)、Herokuにデプロイすると、すべてのURLがルートファイルを介してドロップされ、キャッチオールの1つにキャッチされているように見えます。それらは、defulatロケールの下で「/」にリダイレクトしています。

私のセットアップは次のとおりです

application_controller.rb

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

private
def set_locale
  I18n.locale = params[:locale] if params[:locale].present?
end

ルート.rb

scope ":locale", locale: /#{I18n.available_locales.join("|")}/  do
  all_my_routes

  # handles /valid-locale
  root to: 'home#index', as: "localized_root"
  # handles /valid-locale/fake-path
  match '*path', to: redirect { |params, request| "/#{params[:locale]}" }
end

# handles /
root to: redirect("/#{I18n.default_locale}")

# handles /bad-locale|anything/valid-path
match '/*locale/*path', to: redirect("/#{I18n.default_locale}/%{path}")

# handles /anything|valid-path-but-no-locale
match '/*path', to: redirect("/#{I18n.default_locale}/%{path}")

私のホームリンク:

<%= link_to "Home", root_path %>
4

4 に答える 4

8

何度か行ったり来たりした後、私は最終的にこれを機能させました。問題は、すべてのルートをキャッチすることは、a)予想以上にキャッチし、b)開発と展開で明らかに異なる動作をすることでした(なぜこれがわからないのか)。

とにかく、最初にスコープを変更してオプションにしました(括弧に注意してください)。

scope "(:locale)", .....

これにより、ロケールが設定されていない場合でもスコープルートが有効になります(これは主に、コールバックなどで発生したいくつかの問題を処理するためです)。

root toこれにより、2行を削除し、

root to "home#index"

「handles/valid-locale / fake-path」行を削除しました。これにより、「/」パスで問題が発生していました。

次に、スコープの後に次のキャッチオールを保持しました(最後のものに注意してください)。

# handles /bad-locale|anything/valid-path
match '/*locale/*path', to: redirect("/#{I18n.default_locale}/%{path}")

# handles /anything|valid-path-but-no-locale
match '/*path', to: redirect("/#{I18n.default_locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" }

# handles /
match '', to: redirect("/#{I18n.locale}")

興味深い点として、新しいローカライズされたURLを処理するためにaction_mailerも更新する必要がありました。

config.action_mailer.default_url_options = { :host => 'path.to.my.app.com', :locale => I18n.locale }

そして今、すべてが機能しているように見えます!

于 2012-12-21T10:47:57.160 に答える
7

この仕事を素晴らしくする宝石があります。(https://github.com/svenfuchs/routing-filter)次のコードをGemfileに追加する必要があります。

gem 'routing-filter'

そして、routes.rbファイルに以下を追加します

Rails.application.routes.draw do
  filter :locale
  ...
end

それが役に立てば幸い...

于 2012-12-20T15:30:59.047 に答える
6

このブログ投稿では、実際に詳細に説明しています。

何も機能していないように見えるときに私が探していたもの

http://dhampik.com/blog/rails-routes-tricks-with-locales

  scope "/:locale", locale: /#{I18n.available_locales.join("|")}/ do
    resources :posts    
    root to: "main#index"
  end

  root to: redirect("/#{I18n.default_locale}", status: 302), as: :redirected_root

  get "/*path", to: redirect("/#{I18n.default_locale}/%{path}", status: 302), constraints: {path: /(?!(#{I18n.available_locales.join("|")})\/).*/}, format: false

ルートからデフォルトの言語にリダイレクトし、他の多くのことも行います。

于 2013-11-20T15:17:22.753 に答える
0

Railscastsに書いたコメントを使用して、I18nルーティングを支援できたようです。涼しい!

最初の問題については、代わりroot to: redirect("/#{I18n.default_locale}")にリダイレクトするようにルートを変更できますか?I18n.locale

2番目の問題については、Railscastコメントのテストも使用しましたか、それとも独自のテストを使用しましたか。合格した場合は、合格しましたか。Herokuはエラーログを提供しますか?($ heroku logs)。これらのルートはHerokuにデプロイされて期待どおりに機能しているので、Herokuでは問題にならない可能性があると思います。

于 2012-12-21T05:03:06.407 に答える