переименование маршрутов (map, link_to, to_param) в рельсах
-
20-08-2019 - |
Вопрос
У меня возникла небольшая проблема... Я настраиваю приложение Rails, которое должно обслуживать немецкий веб-сайт.Чтобы использовать внутренние функции множественного числа Rails, я сохранил все свои модели на английском языке (например,модель "JobDescription
").Теперь, если я позвоню "http://mysite.com/job_descriptions/
", я получаю все свои job_descriptions
....Все идет нормально.Потому что мне не нужен английский термин "job_descriptions
" в моем URL-адресе я поместил следующее в свой маршрут.рб
map.german_term '/german_term', :controller => 'job_descriptions', :action => 'index'
map.german_term '/german_term/:id', :controller => 'job_descriptions', :action => 'show'
Если я позвоню"http://mysite.com/german_term/
" или "http://mysite.com/german_term/283
«Я получаю все свои job_descriptions
, и это нормально.
Однако, чтобы сделать URL-адрес более оптимизированным для SEO, я бы хотел заменить идентификатор на более удобный фрагмент URL-адреса.Таким образом, я положил в свой job_description.rb
:
def to_param
"#{id}-#{name.gsub(/[^a-z0-9]+/i, '-')}"
end
который всякий раз, когда я использую "job_description_path
" в любой link_to
метод, преобразует мои URL-адреса во что-то вроде "http://mysite/job_descriptions/13-my-job-description-title".
Однако, и именно здесь я застрял, мне бы хотелось попасть»http://mysite/german_term/13-my-job-description-title
".Я уже пытался обменять "job_description_path
" с "german_term_path
" в коде link_to, но это только генерирует "http://mysite/german_term/13
".Очевидно, to_param
не называется.Один из обходных путей, который я нашел, — создать ссылку с помощью:
<%= link_to job_description.name, german_term_path(job_description.to_param) %>
Но менять все это довольно утомительно. link_to
вызывает мой код.Я хочу заменить "job_description
" к "german_term
" всякий раз, когда это происходит в URL-адресе.
Есть идеи?!?
С уважением,
Себастьян
Решение
Я думаю, вам придется использовать помощники restful маршрута, чтобы получить то, что вы хотите.
В этом случае не потребуется много рефакторинга (при условии, что вы сопоставили JobDescriptions как ресурс).Оставьте to_param как есть и измените маршрут JobDescriptions примерно на следующий:
map.resources :job_descriptions, :as => 'german_term'
Надеюсь это поможет!
Другие советы
Rails использует только
def to_params
end
Конструктор URL-адресов, когда вы используете спокойный помощник по маршрутам/ссылкам.Единственный известный мне способ — сделать это так же, как вы, если только вы не хотите просто отказаться от англоязычных ссылок и делать все это на немецком языке.В этом случае просто избавьтесь от именованных строк маршрута и измените to_params, чтобы использовать правильное поле имени из базы данных.На этом этапе маршруты REST должны вести себя правильно.