little ruby blog

небольшой блог о ruby, rails и разной фигне

Rails-маршруты в Javascript

| Comments

Какая проблема?

Каждому фронтэнд-девелоперу наверняка знакома проблема поддержки актуальными маршрутов в java- или coffeescript. Поменялась схема маршрутов - и вот, снова нужно переписывать тонны скриптов, меняя в них всех URL.

Как решить?

Решение, как и в предыдущем посте, предложили Railsware, а вернее - по большей части Богдан Гусев.

Гем называется js-routes, в его задачу входит генерировать объект Routes (он может называться иначе), который содержит в себе маршруты в виде функций - то есть, вы можете вместо набивших оскомину ручных заполнений маршрутов использовать код вида:

1
  console.log(Routes.action_controller_path(id))

## Как это работает?

Всё очень просто. Для начала в Gemfile добавляем строчку

1
gem 'js-routes'

Следующим шагом выполняем bundle install и добавляем js-routes в манифест application.js.

1
//=require js-routes

Готово!

Гем также имеет некоторые возможности по тонкой настройке, которые задаются в initializers при помощи следующей конструкции:

1
2
3
JsRoutes.setup do |config|
  config.option = value
end

Опции следующие:

  • default_format - формат, который передается маршруту. По умолчанию - пустой
  • exclude - массив регулярных выражений для исключения из объекта Routes. Регулярные выражения применяются к имени маршрута, а не к собственно URL. По умолчанию - пустой
  • include - то же самое, только для добавления в маршруты
  • namespace - глобальный объект для доступа к маршрутам. По умолчанию Routes, но поддерживает неймспейсы вида MyProject.routes
  • prefix - назначение очевидно из названия. Используется для добавления префикса к каждому URL. По умолчанию - пустой

К тому же, js-routes принимает на вход в качестве параметра маршрута и сериализованные объекты:

1
2
3
Routes.users_path(1) // "/users/1"
var test = {id: 1, name: "Test"}
Routes.users_path(test) // "/users/1"

Подводные камни

К сожалению, на данный момент js-routes не умеет генерировать _url-объекты. То есть, самый простой путь - это делать в initializers следующую конструкцию:

1
2
3
JsRoutes.generate!("#{path_to_js_assets}/routes.js", namespace: "Routes")
JsRoutes.generate!("#{path_to_js_assets}/full_routes.js", namespace: "FullRoutes",
prefix: 'http://yourdomain.com')

И добавить в манифест вместо //=require js-routes следующую конструкцию:

1
2
//=require routes
//=require full_routes

Pull-request, добавляющий в js-routes поддержку _url, в данный момент находится на рассмотрении.

Comments