Rails は現在のページにリンクし、パラメータを渡します 質問する

Rails は現在のページにリンクし、パラメータを渡します 質問する

私はURLパラメータを使ってロケールを渡すことでRailsアプリケーションにI18Nを追加しています。私のURLは次のようになります。http://example.com/en/ユーザーそしてhttp://example.com/ar/users(それぞれ英語およびアラビア語のロケールの場合)。

ルート ファイルでは、:path_prefix オプションを使用してルートを定義しました。

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

ロケールはApplicationControllerで定義されたbefore_filterを使用して設定されています

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

また、アプリケーションによって生成されるすべての URL にロケールを追加するために、ApplicationController#default_url_options も定義しました。

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

私が望んでいるのは、レイアウト ヘッダー (すべてのページに表示される) に、同じページだが別のロケールのページにリンクするリンクを追加することです。

たとえば、アラビア語のロケールを閲覧している場合、ヘッダーに「英語」リンクを配置して、現在のページにリダイレクトし、ロケールを英語に設定する必要があります。これを Rails で実行する方法はありますか?

ベストアンサー1

これを見つけるのに少し時間がかかりましたが、これが私の解決策です:

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' は、予想どおり現在のコントローラを保持します。この動作は、:controller、:id、およびルートのパスに配置されるその他のパラメータを含む他のパラメータにも適用されます。

したがって、url_for を使用すると、現在のリクエストのパラメータがデフォルトになります。コード内で必要なものを変更するだけです。この場合、変更したのは :locale だけなので、他のすべては同じままです。

これは「hidden」:parameters でも機能することに注意してください。つまり、次のようになります:

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

上記の url_for をページ /en/my_map で使用すると、URL に 'home' が含まれなくなります (つまり、/en/home/my_map)。ボーナスです。

おすすめ記事