Статьи

Обновление ума до Rails 4

rails4

Если вы потратили какое-то время на Rails, у вас, несомненно, был момент, когда вы выполняли работу над проектом в определенной версии, и обновление до последней и самой лучшей версии не могло быть и речи. Это случилось со мной во время работы над множеством (в то время) проектов с нуля, которые начали свою жизнь во времена Rails 3. Когда поставлялся Rails 4, команда приняла решение НЕ обновлять из-за отсутствия ценности, предоставляемой обновлением. ,

Недавно я познакомился с проектом на Rails 4.1 и хотел бы поделиться своим опытом по улучшению моего мышления в соглашениях Rails 4.

Настроить

Начинать с Rails 4 как никогда просто. Давайте посмотрим, что происходит, когда генерируется новый проект.

$ rails new hello_rails4 

Gemfile

Сгенерированный Gemfile намного чище, чем вы привыкли в старых версиях Rails. Ушли в прошлое группа assets и другие вещи, которые заставили ее чувствовать себя беспорядочно.

весна

Одним интересным дополнением является эта строка:

 # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/jonleighton/spring gem 'spring', group: :development 

Весенний драгоценный камень действительно ускоряет развитие. Он загружает среду Rails только один раз, например, при выполнении граблей, которые выполнялись вечно. Я использовал для этого драгоценный камень Zeus , но весенний драгоценный камень встроен и чувствует себя намного более легким.

Чтобы настроить его, все, что вам нужно сделать, это запустить эту команду

 $ bundle exec spring binstub --all 

и запустите ваши команды из каталога ./bin . Если вы, как и я, устали указывать «./bin» для этих команд, вы можете установить direnv (через homebrew, если вы на Mac) и добавить эту строку в файл .envrc в проекте.

 export PATH=$PWD/bin:$PATH 

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

Если вы используете rspec и cucumber для своих тестов, вы также захотите добавить spring-commands-rspec и spring-commands-cucumber в свой Gemfile.

 gem "spring-commands-rspec" gem "spring-commands-cucumber" 

Вам нужно будет перестроить свои binstubs, чтобы они вступили в силу.

 $ bundle exec spring binstub --all 

Когда вы это сделаете, вы получите такое же ускорение выполнения ваших тестов, как и при выполнении других задач Rails.

Turbolinks

Если вам нравится хороший спор, Turbolinks — одна из самых обсуждаемых возможностей, попавших в Rails со времен конвейера активов. Как и в случае с конвейером активов, отключить его не составляет особого труда, поэтому противоречие (опять же) необоснованно.

Если вы решите использовать турболинки, вы можете наткнуться на некоторые ошибки. Я знаю, что сделал, и мне потребовалось некоторое время, чтобы понять их.

JQuery DOM загружен

При использовании турболинков вы не всегда получаете событие jQuery «DOM загружен» при изменении страницы. Помните, что страница загружается только один раз, а последующие запросы только обновляют содержимое страницы.

Большинство приложений используют это событие для инициализации своих обработчиков JavaScript. Вы склонны видеть такие вещи, как, например, инициализация fancybox.

coffeescript jQuery -> $('.fancybox').fancybox()

Чтобы это исправить, вам нужно привязать к двум событиям. Исходное загруженное событие DOM и новая page:load событие page:load . Если вы инициализируете таким образом, большинство JavaScript должно работать нормально.

coffeescript $(document).on 'ready page:load', -> $('.fancybox').fancybox()

вопросы

Когда вы сталкиваетесь с проблемами в Rails 4.1, это обычно происходит с сторонними библиотеками и гемами, которые не обновлялись и предполагают наличие чистого листа при каждом показе страницы.

У меня была проблема с гемом recaptcha, когда капча нормально загружалась при обновлении страницы, но вообще не отображалась при щелчке по ссылке на страницу. Часто в подобных случаях вы сталкиваетесь с тем, что авторы библиотеки обсуждают варианты ее использования с турболинками. В этом конкретном случае помощнику формы необходимо включить ajax:

ruby recaptcha_tags ajax: true

Выключение

Когда вы сталкиваетесь с проблемой, для которой нет простого решения, всегда есть возможность отключить турболинк для одной страницы. Просто добавьте в data-no-turbolink атрибут data-no-turbolink . Страница теперь будет загружаться по стандартному запросу.

Для полного отключения турболинков необходимо:

  • удалить gem 'turbolinks' из вас Gemfile
  • удалите turbolinks_track из тегов javascript и таблицы стилей в макете
  • удалить //= require turbolinks из application.js

Rails 4 Конфигурация и Героку

В Rails 3 есть много способов выполнить настройку приложения. Из простого, но сломанного

 if Rails.env.production Braintree::Configuration.environment = :production Braintree::Configuration.merchant_id = "merchant_id" Braintree::Configuration.public_key = "public_key" Braintree::Configuration.private_key = "private_key" else Braintree::Configuration.environment = :sandbox Braintree::Configuration.merchant_id = "sandbox_merchant_id" Braintree::Configuration.public_key = "sandbox_public_key" Braintree::Configuration.private_key = "sandbox_private_key" end 

чтобы загрузить файлы конфигурации приложения самостоятельно, как Райан Бейтс описывает в своей конфигурации YAML railscast # 85 .

Ничто из этого никогда не казалось подходящим, особенно когда Heroku является вашей платформой развертывания. Использование Heroku переменных среды — это хорошее дизайнерское решение, но мы разработчики Rails и ленивы. «Хороший» вид ленивый, поэтому мы остановились на использовании драгоценного камня figaro .

Я не собираюсь углубляться в то, как работает самоцвет (документы для него великолепны). Достаточно сказать, что драгоценный камень Figaro обеспечивает лучшее из обоих миров:

  • Простота иметь конфигурацию в файлах, которыми вы управляете, и не проверять их внутри системы контроля версий. Мы ленивы, поэтому больше не нужно тратить время на загрузку переменных окружения.
  • Возможность развертывания и наличие реальных переменных среды влияют на Heroku.

Я мог бы продолжить использовать figaro с Rails 4, но поскольку я наткнулся на эту статью автора драгоценности figaro, я хотел использовать встроенную функциональность в Rails 4.1 — secrets.yml .

Отсутствие необходимости устанавливать еще один драгоценный камень для обработки того, что фреймворк должен был включить с самого начала, всегда является победой в моей книге. Честно говоря, встроенная функциональность не самая функциональная. Если вы выполняете ручную настройку серверов приложений, копирование файлов secrets.yml может быть вариантом, но если вы хотите развернуть его в Heroku, у вас есть проблема, поскольку Heroku использует переменные среды.

Надеемся, что проблема переменных среды будет решена в ближайшем будущем. А пока я собираюсь добавить это облегченное расширение для функции secrets.yml в Rails 4.1:

 gem 'heroku_secrets', github: 'alexpeattie/heroku_secrets' 

Чтобы использовать его, создайте файл config / secrets.yml . Обратите внимание, что вы можете использовать синтаксис привязки и ссылки, чтобы немного высушить его.

 default: &default recaptcha_public_key: "" recaptcha_private_key: "" development: <<: *default secret_key_base: '' test: <<: *default secret_key_base: '' production: <<: *default secret_key_base: '' google_analytics_code: '' smtp_username: '[email protected]' smtp_password: 'xxx' smtp_domain: 'example.com' smtp_address: 'smtp.example.com' 

Вы можете попросить гем скопировать вашу производственную конфигурацию в Heroku с помощью задачи rake и автоматически подобрать переменные:

 $ rake heroku:secrets[heroku_app_name] RAILS_ENV=production 

Вот и все! Теперь у вас есть настроенное приложение и вы можете использовать Rails, чтобы выполнить настройку за вас

 Braintree::Configuration.environment = Rails.application.secrets.braintree_environment Braintree::Configuration.merchant_id = Rails.application.secrets.braintree_merchant_id Braintree::Configuration.public_key = Rails.application.secrets.braintree_public_key Braintree::Configuration.private_key = Rails.application.secrets.private_key 

Не забудьте добавить этот файл в ваш файл .gitignore , так как Rails пока не делает этого по умолчанию.

Вывод

Rails 4 намного проще, чем его предшественник. Большинство изменений в форме новых функций, которые (при правильном использовании) улучшают вашу жизнь как разработчика. Отказаться легче, чем когда-либо, если что-то не работает для вашей конкретной ситуации.

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