Как использовать link_to, чтобы все параметры, передаваемые в контроллер, сохранялись в Ruby on Rails 2? - PullRequest
2 голосов
/ 17 февраля 2011

У меня есть двуязычный сайт с хорошими URL для SEO. Использование Ruby on Rails 2.3.10.

routes.rb фрагмент:

map.connect 'order-jira-hosting/:option.html',
    :controller => 'order', :action => 'index', :locale => 'en'
map.connect 'order-jira-with-greenhopper-hosting/:option.html',
    :controller => 'order', :action => 'index', :locale => 'en', :greenhopper => true
map.connect 'zamow-hosting-jira/:option.html',
    :controller => 'order', :action => 'index', :locale => 'pl'
map.connect 'zamow-hosting-jira-z-greenhopper/:option.html',
    :controller => 'order', :action => 'index', :locale => 'pl', :greenhopper => true

Как видите, :locale и :greenhopper "скрыты" в URL.

Существует переключатель, позволяющий изменить язык текущей страницы. Смотрите мой views/layouts/default.erb:

<%= link_to image_tag('icons/polish.png',  :alt => 'polski'),  { :locale => 'pl'}, :class => 'a' %>
<%= link_to image_tag('icons/english.png', :alt => 'English'), { :locale => 'en'}, :class => 'a' %>

Я просто не указываю контроллер и действие, поэтому я перенаправлен на текущий контроллер и действие с другой локалью. К сожалению, параметр: greenhopper теряется.

  1. Я нахожусь на /order-jira-with-greenhopper-hosting/11.html
    (:option => 11, :locale => 'en', :greenhopper => true) * * тысяча двадцать-одна
  2. Сгенерированные ссылки для переключения языков: /order-jira-hosting/11.html и /zamow-hosting-jira/11.html
    (:option => 11, :locale => 'pl' and 'en', :greenhopper => false) ...
  3. ... Но они должны быть /order-jira-with-greenhopper-hosting/11.html и /zamow-hosting-jira-z-greenhopper/11.html
    (:option => 11, :locale => 'pl' and 'en', :greenhopper => true)

Как использовать метод link_to, чтобы все параметры, передаваемые в контроллер, сохранялись? Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 17 февраля 2011

Вы можете основать хеш, который вы отправляете на link_to, из хеша params, который, если вы передадите его в link_to как есть, перезагрузит текущую страницу.Вы можете использовать Hash.merge(other_hash) для сброса ключа :locale для каждой ссылки:

<%= link_to '<polish image />', params.merge({:locale => 'pl'}), :class => 'a' %>

Теперь params содержит контроллер и клавиши действий, но они являются контроллероми действие, которое сгенерировало текущую страницу, поэтому ссылка должна вести себя так же, как обновление страницы, с изменением только параметров, которые вы изменили с помощью params.merge.

Надеюсь, это поможет!

PS: params.merge не меняет хэш параметров, если вас это беспокоит - результат слияния возвращается как новый хеш.

...