Статьи

Nitrous.IO: разработка Rails в облаке

ProvisioningBox

Хорошо заземленный

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

  • Рубин
  • Возвышенный текст 2
  • РВМ
  • Bundler
  • PostgreSQL
  • мерзавец
  • Инструменты для совместной работы (возможно)
  • Heroku Toolkit (на Mac)

Возможно, у вас есть аналогичные настройки. И, как и я, вам удобнее всего работать с приложением Rails на этой машине (для меня это мой MacBook Pro), поскольку оно содержит всю вашу среду разработки. И наоборот, довольно сложно работать над проектом (новым или существующим) без этого набора необходимых инструментов.

Жизнь в «Облаке»

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

Вот почему я был очень взволнован, обнаружив Nitrous.IO . Это не просто еще один браузерный редактор кода. Nitrous.IO — это полная среда разработки в экземпляре EC2. Все инструменты, которые я упомянул (работает под Linux) могут быть загружены. Главное, что у вас есть выбор между окном онлайн-браузера и вашим любимым редактором оболочки (VIM, Emacs). Если вы пользователь Mac, есть очень новое приложение OSX, которое подключает ваш компьютер напрямую к вашим экземплярам Nitrous.IO !

Но я не ожидаю, что вы просто поверите мне на слово. Цель этой статьи — дать вам быстрый обзор этого сервиса и указать на некоторые функции, которые я считаю особенно заслуживающими внимания. Я уверен, что вы поделитесь моим энтузиазмом, потратив немного времени на его самостоятельное изучение.

Настройка

Там практически нет установки. Все, что вам нужно для начала работы, включено. Вы можете создать учетную запись и начать писать код сразу. Направьте ваш браузер на Nitrous.IO.
NitrousRegistration

Если вы используете свою учетную запись Github для аутентификации, вы устанавливаете ссылку на свои репозитории кода и сразу получаете немного N20 (см. Боковую панель).

Зарабатывать нитро

Вы можете заработать больше возможностей в системе с «очками», которые они называют N20.
Я думаю, что это очень умный маркетинг; Вы заряжаете свой аккаунт. Это начинается с завершения процесса регистрации.
После этого есть несколько способов заработать больше N20, которые вы можете «потратить» на некоторые дополнительные услуги.

EarnN20

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

Создайте свою первую коробку

Каждый «экземпляр» на Nitrous.IO называется «Коробкой». NewBox

Перейти к ящикам и настроить ящик.

Здесь вы должны выбрать среду, в которой вы хотите работать с этой коробкой. В нашем случае мы выберем «Ruby on Rails», но я призываю вас изучить другие; особенно если это технологии, с которыми вы часто работаете.

CreateBoxROR

Кроме того, вы должны назвать свой ящик и выбрать регион для экземпляра EC2, который будет создан. После того, как вы создали это окно, вы можете «Пуск», «Завершить» и ввести «IDE» с панели инструментов.

Когда вы создаете коробку, она должна начаться автоматически.
Когда Box запустится, вы можете нажать на IDE (или Terminal, если вы так склонны. Мы останемся в браузере для этой статьи), и вам будет представлена ​​онлайн-среда разработки.

Обратите внимание, что в дополнение к стандартному меню в верхней части среды IDE есть поддержка многих стандартных сочетаний клавиш. Это то, что мне действительно нравится. Я склонен ездить на клавиатуре. Когда я нахожусь в гуще написания кода, отвлекает меня от того, чтобы вытянуть руку, чтобы дотянуться до трекпада.

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

В нижней части окна браузера находится Терминал. Среда Nitrous.IO предоставляет действительно лучшее из всех миров , объединяя

  • Инструменты с графическим интерфейсом
  • проводник файловой системы
  • терминальный экземпляр

И вы не ограничены только одним экземпляром. Нажмите плюс «+», чтобы начать другую на новой вкладке.
«X» в крайнем правом углу откроет Терминал в полноэкранном режиме.


Это система Linux, и вы можете узнать подробности об ОС, набрав cat /etc/*-release


Перейдите по ссылке « Ящики» и нажмите на свое новое окно.
PublicKey
Вы заметите, что среди информации о каждом окне есть «Предварительный просмотр URI». Это для интерактивного предварительного просмотра вашего проекта во время работы над ним.

Давайте напишем немного кода Ruby

Это только краткий обзор интерфейса. Я верю, что вы откроете для себя еще много вкусностей. Пришло время загрузить некоторые инструменты и написать код!

На момент написания этой статьи диспетчер пакетов AutoParts был только что анонсирован. Принцип, лежащий в основе этого, заключается в предоставлении готовых наборов инструментов и утилит, которые можно легко загрузить на любую коробку Nitrous.IO.
Используйте команду search который продолжает расти.

Инструменты инициализации

В результате выбора Ruby On Rails многие инструменты уже подготовлены:

  • мерзавец
  • Bundler
  • Heroku клиент
  • Рубин 1.9
  • Rails 4.0.0
  • MySQL & sqlite3

Это все, что нужно для мгновенного создания приложения на Rails 4!

Я упомянул RVM как часть моего списка стандартных инструментов. Это не входит, но вы можете легко загрузить его, если планируете работать с несколькими версиями Ruby (и Rails). У Тимоти Борончика есть отличная статья об установке RVM в Ubuntu .

Посмотрев в меню « Соединение» в среде IDE, вы увидите доступные для выбора базы данных.
ConnectMenu

Этого вполне достаточно «Экскурсия». НАПИШИТЕ НЕКОТОРЫЙ КОД

Создание приложения Rails

Как разработчик Serial Rails , я начинаю каждый проект Rails с логики User / Session Authentication. Это распространено практически во всех веб-приложениях. Я подумал, что это послужит простым примером для демонстрации Nitrous.IO, если мы создадим основу приложения Rails, внедрив регистрацию пользователей «с нуля».

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

В окне консоли введите следующее:

 rails new youzer

потом

 cd youzer

Следуйте этому с этими тремя командами.

 rails g model User name:string email:string password:string password_confirmation:string password_digest:string
rails g controller Users new create
rails g controller Sessions index new create logout destroy

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

приложение / модели / user.rb
 class User < ActiveRecord::Base
  attr_accessible :email, :name, :password, :password_confirmation, :password_digest
  has_secure_password   #This is the Rails 3 'magic' 
  validates_presence_of :password, :on => :create
end
приложение / контроллеры / application_controller.rb
 class ApplicationController < ActionController::Base
  protect_from_forgery

private

def authenticate_user!
  if current_user.nil?
    redirect_to login_url, :alert => "You must first log in to access this page"
  end
end

def current_user
 begin
     @current_user ||= session[:user_id] && User.find(session[:user_id])
 rescue
 end
end

def user_signed_in?
 begin
  User.where("id=?", session[:user_id]).exists?
 rescue
  false
 end
end

  helper_method :current_user, :user_signed_in?, :authenticate_user?

end
приложение / контроллеры / sessions_controller.rb
 class SessionsController < ApplicationController
  def index
  end

  def new
  end

  def create
    user = User.find_by_email(params[:email].downcase)
    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
      redirect_to root_url, :notice => "Welcome #{user.name}"  #you may wish to modify this redirect
    else
      flash.now.alert = "Invalid email or password"
      render "new"
    end
  end

  def logout
    self.destroy
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url, :notice => "Goodbye"
  end

end
приложение / контроллеры / users_controller.rb
 class UsersController < ApplicationController
 def new
  @user = User.new
 end

  def create
  @user = User.new(params[:user])
  @user.name = params[:user][:name]
  @user.email = (params[:user][:email]).downcase
  if @user.save
        session[:user_id] = @user.id
        current_user #call in application helper
   redirect_to :root, :notice => "Registered!"  #you may wish to modify this redirect
  else
   render "new"
  end
  rescue Exception => ex
    logger.warn('ERROR: ' + ex.message)
    flash.now[:error] = 'There was an error creating the user.'
    render :action => 'new' 
 end
end
приложение / просмотров / сессии / new.html.erb
 <%= form_tag sessions_path do %>
<h3>Log in</h3>
  <div class="field">
    <%= label_tag :email %>
    <%= text_field_tag :email, params[:email] %>
  </div>
  <div class="field">
    <%= label_tag :password %>
    <%= password_field_tag :password %>
  </div>
  <div class="actions"><%= submit_tag "Log in" %></div>
<% end %>
приложение / просмотров / пользователей / new.html.erb
 <%= form_for @user do |f| %>
 <% if @user.errors.any? %>
   <div class="error_messages">
    <h2>Form is invalid</h2>
    <ul>
     <% for message in @user.errors.full_messages %>
       <li><%= message %></li>
     <% end %>
    </ul>
   </div>
 <% end %>
<h3>Sign Up</h3>
 <div class="field">
  <%= f.label :name %>
  <%= f.text_field :name %>
 </div>
 <div class="field">
  <%= f.label :email %>
  <%= f.text_field :email %>
 </div>
 <div class="field">
  <%= f.label :password %>
  <%= f.password_field :password %>
 </div>
 <div class="field">
  <%= f.label :password_confirmation %>
  <%= f.password_field :password_confirmation %>
 </div>
 <div class="actions"><%= f.submit "Register" %></div>
<% end %>
приложение / просмотров / макеты / application.html.erb
 <!DOCTYPE html>
<head>
  <title>Your Own User Zero Effort Reset</title>
  <%= stylesheet_link_tag "application", :media => "all" %>
  <%= javascript_include_tag "application" %>
  <%= csrf_meta_tags %>

</head>
<body>
<ul id="nav">
 <% unless user_signed_in? %>
  <li><%= link_to "Log In", sign_in_path %></li>
  <li><%= link_to "Register", sign_up_path %></li>
 <% end %>
    <% if user_signed_in? %>
  <li><%= link_to "Log Out", log_out_path %></li>
 <% end %>
</ul>

<%- flash.each do |key, msg| -%>
  <div id="<%= key %>">
    <p style="float:right;"><a href="#">X</a></p>
    <p><%= msg %></p>
    <div class="clear"></div>
  </div>
<%- end -%>

<%= yield %>

<div id="wrap"></div>
<div id="foot">Application developed by Thom Parkin / Websembly, LLC</div>

</body>
</html>
приложение / Config / routes.rb
 Youzer::Application.routes.draw do
  get "users/new"
  get "users/create"
  get "sessions/index"
  get "sessions/new"
  get "sessions/create"
  get "sessions/logout"
  get "sessions/destroy"

  match 'sign_in' => 'sessions#new', :via => :get
  match 'sign_up' => 'users#new', :via => :get

  match 'log_out' => 'sessions#destroy', :via => :get

  resources :sessions
  resources :users

  root :to => 'sessions#index'
end
Gemfile
 source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'

# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.2'

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

# Use ActiveModel has_secure_password
gem 'bcrypt-ruby', '~> 3.0.0'

gem 'protected_attributes'

# Use unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
gem 'capistrano', group: :development

(Вы не ограничены кодом и ресурсами, создаваемыми в IDE. Существует удобная функция «Загрузка файлов».)

Будьте уверены, что вы сохранили все изменения

Вернувшись в консоль, запустите bundle update Выполните эти две команды для переноса базы данных (в среде DEVELOPMENT)

 RAILS_ENV=development && bundle exec rake db:create
RAILS_ENV=development && bundle exec rake db:migrate
предварительный просмотр

В командной строке введите rails server

Это запустит сервер разработки Webbrick. Используемый порт (по умолчанию) — 3000. Обратите внимание, что для этого есть выбор в меню « Предварительный просмотр» .

Если вы предпочитаете другой сервер (например, Thin), просто установите его.

PreviewMenu
Нажмите Preview Port 3000, чтобы увидеть результаты ваших усилий.

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

Это всего лишь скелет приложения Rails. Но отсюда не может бежать, это только для развития. Нам все еще нужно развернуть его.

Развертывание

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

тесты

Test Driven Development, верно? Таким образом, мы должны были сначала написать несколько тестов.
Я оставлю это вам, прежде чем добавлять больше функциональности в этот проект. Цель состояла в том, чтобы продемонстрировать, как просто вы можете создать новое приложение Rails.

Github

Существует простой способ получить открытый ключ SSH и установить соединение с вашей учетной записью Github.
PublicKeyGithub
И это еще один способ заработать дополнительный N20 на свой счет!

сотрудничество

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

Руководство @ Каждый шаг

Люди, стоящие за Nitrous, являются разработчиками и твердо верят в «Счастье разработчика».

Помощь очень понятна и полна. Не должно быть точки, в которой вы чувствуете себя потерянным или застрявшим.
На панели инструментов есть кнопка «пригласить», которая позволяет вам поделиться Nitrous.IO и заработать еще немного N20 для себя.

Nitrous.IO явно написана разработчиками и разработчиками FOR. Это дает обещание работать полностью «в облаке».

С постоянно растущей доступностью беспроводного доступа в Интернет и тенденцией работы в «мобильном» состоянии имеет смысл просто создавать / обновлять / поддерживать приложения Rails в облаке.

Я больше не привязан к какому-либо конкретному устройству при разработке приложений на Rails. И независимо от моего местоположения или оборудования, к которому у меня есть доступ, я могу запускать, продолжать и завершать ЛЮБОЙ проект Rails удаленно. Миграция на новый компьютер больше не наносит мне вреда за время, необходимое для «правильного» окружения. Я ожидаю, что однажды очень скоро мои «требования к оборудованию» для компьютера (хотя бы ноутбука, планшета, телефона) станут не более, чем возможностями WiFi.

Иегуда Кац сообщил, что « Nitrous.IO и ChromeOS — это действительно идеальный выбор ». Со времени написания этой статьи появилось новое Chrome Packaged App для Nitrous.

{Весь код для этой статьи доступен в этом Gist }