Направляющие связываются с текущей страницей и передающими параметрами к ней

Я добавляю I18N к своему приложению направляющих путем передачи локали с помощью параметрических усилителей URL. Мои URL похожи на http://example.com/en/users и http://example.com/ar/users (для английских и арабских локалей соответственно).

В моем файле маршрутов я определил свои маршруты с a: опция path_prefix:

map.resources :users, :path_prefix => '/: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

То, что я хочу, должно добавить ссылку в заголовке расположения (отображенный на всех страницах), который связался бы с той же страницей, но с другой локалью.

Например, если я просматриваю арабскую локаль, я хочу "английскую" ссылку в заголовке, который перенаправит меня назад к моей текущей странице, и устанавливать локаль на английский язык. Существует ли способ сделать это в направляющих?

47
задан Faisal 30 March 2010 в 07:50
поделиться

2 ответа

Мне потребовалось время, чтобы найти это, но вот мое решение:

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, поэтому все остальное осталось прежним.

Обратите внимание, что это также работает для «скрытых»: параметров. Итак, если у вас есть:

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

, используя указанный выше url_for на странице / en / my_map, в URL-адресе не будет 'home' (т.е. / en / home / my_map). Бонус.

111
ответ дан 26 November 2019 в 19:20
поделиться

Вы можете проанализировать request_uri и заменить ваш языковой стандарт в пути на регулярное выражение

Хорошо, вот вспомогательный пример. Если я правильно понимаю цель

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"

Это начальная точка, поэтому вы можете сделать что-то другое, что вам нужно

2
ответ дан 26 November 2019 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: