Temas:
- Internacionalização
- Testes
- Deploy
Internacionalização é o processo de tornar sua aplicação "traduzível" para mais de um idioma. O Rails conta com ótimos recursos para auxiliar nesse processo.
Para testarmos a internacionalização, utilizaremos uma aplicação bastante simples. Portanto, se desejar, clone a aplicação a partir do seguinte repositório:
$ git clone https://github.com/alexkutzke/rails-tasks.git
A internacionalização com Rails funciona a partir de arquivos do tipo yaml que contém as traduções pertinentes.
O objetivo é utilizar a API I18n
sempre que for necessário exibir um conteúdo intercionalizado. Os dois principais métodos dessa API são:
translate # Lookup text translations
localize # Localize Date and Time objects to local formats
# podem ser utilizados os atalhos t e l
I18n.t 'store.title'
I18n.l Time.now
Para iniciar alguns testes de internacionalização, crie um novo arquivo em config/initializers/locale.rb
como seguinte conteúdo:
I18n.available_locales = [:en, :'pt-BR']
I18n.default_locale = :'pt-BR'
E crie o arquivo config/locales/pt-BR.yml
com o seguinte conteúdo:
pt-BR:
hello: "Bem-vindo!"
activerecord:
models:
list:
one: "Lista"
other: "Listas"
attributes:
list:
name: "Nome"
Adicione o seguinte comando no arquivo "views/list/index.html.erb"
<%= t('welcome_html', username: current_user.email) %>
<h1><%= t List.model_name.human %> </h1>
Reinicie o servidor da aplicação e acesse list#index
pelo navegador.
Para realizar testes mais rápidos, adicione o seguinte conteúdo ao arquivo controllers/application_controller.rb
:
before_action :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
Altere o conteúdo do arquivo config/locales/en.yml
en:
welcome_html: "<b>Welcome %{username}!</b>"
E adicione o seguinte ao final da sua URL ao acessar a aplicação:
?locale=en
Para facilitar a tradução de sua aplicação, exitem arquivos yaml para diferentes línguas disponibilizados na web. Por exemplo:
- https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/pt-BR.yml
- https://gist.github.com/mateusg/924555
Basta adicionar os arquivos em config/locale
com o nome pertinente. Por exemplo, devise.pt-BR.yml
.
Lembre-se sempre de reiniciar o servidor da aplicação ao fazer alterações em arquivos de locales!
Ruby on Rails fornece toda uma suite de funcionalidades para a realização de testes em sua aplicação. Isso tem como objetivo o favorecimento da prática de TDD (Test-Driven Development). Mais informações em: http://guides.rubyonrails.org/testing.html
Para uma demonstração de testes, altere o arquivo test/models/list_teste.rb
para o seguinte:
require 'test_helper'
class ListTest < ActiveSupport::TestCase
test "should not save list without title" do
list = List.new
assert_not list.save
end
end
E execute:
# talvez seja necessário executar:
rm db/test.sqlite3
rails db:migrate RAILS_ENV=test
#-------------------------------
rails test
Você deve ter uma saída como essa:
Running via Spring preloader in process 8390
Run options: --seed 49470
# Running:
...F
Failure:
ListTest#test_should_not_save_list_without_title [/vagrant/rails-tasks/test/models/list_test.rb:10]:
Expected true to be nil or false
bin/rails test test/models/list_test.rb:8
.......
Finished in 2.090959s, 5.2607 runs/s, 7.1737 assertions/s.
11 runs, 15 assertions, 1 failures, 0 errors, 0 skips
A saída acima informa que teste recém criado falhou. Isso ocorreu pois o Model List aceita novas listas com título vazio, quando o esperado era o contrário. Para corrigir o problema, adiciona a validação pertinente:
class List < ApplicationRecord
has_many :tasks, dependent: :destroy
belongs_to :user
validates :name, presence: true
end
E execute novamente:
rails test
A saída agora indicará que todos os testes foram executados com sucesso:
E execute:
Running via Spring preloader in process 8440
Run options: --seed 12982
# Running:
...........
Finished in 1.926550s, 5.7097 runs/s, 7.7859 assertions/s.
11 runs, 15 assertions, 0 failures, 0 errors, 0 skips
Algumas gems interessantes para testes:
- Cucumber [para Behaviour-Driven Development (BDD)];
- Rspec;
- Capybara [gems acima podem utilizar essa].
Repositório git com a Aplicação Movie-Store "completa": https://github.com/alexkutzke/movie-store-final
Existem diferentes maneiras de realizar o deploy de uma aplicação Ruby on Rails. De maneira geral, esse processo envolve a preparação do ambiente de produção(instalação de gems, criação de usuários, etc) e a configuração de um servidor Web mais robusto (como Apache ou nginx) para que este possa executar aplicações Ruby.
Nesse guia, configuraremos um deploy simples da aplicação Movie Store sobre um sistema Linux (Ubuntu) e servidor web nginx, utilizando o servidor de aplicações Passenger. Em caso de dúvidas, consulte o guia de instalação e uso do Passenger.
O primeiro passo para iniciarmos o deploy é levantar a máquina virtual como nas outras aulas. Portanto, se você está utilizando uma das máquinas do laboratório, execute os seguintes comandos no terminal (adapte-os se para o seu ambiente caso esteja utilizando outro computador):
$ cd vagrant/cursoror
$ vagrant up
$ vagrant ssh
# aguarde a máquina virtual iniciar
# os próximos comandos são executados dentro da máquina virtual
$ cd /vagrant
Os próximos comandos instalam as aplicações necessárias. São elas: nodejs, nginx, mysql e passenger.
$ sudo apt-get update
$ sudo apt-get install -y curl gnupg build-essential mysql-server mysql-client libmysqlclient-dev nodejs && sudo ln -sf /usr/bin/nodejs /usr/local/bin/node
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
$ sudo apt-get install -y apt-transport-https ca-certificates
$ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger precise main > /etc/apt/sources.list.d/passenger.list'
$ sudo apt-get update
$ sudo apt-get install -y nginx-extras passenger
Agora, é necessário habilitar o Passenger no servidor nginx. Para isso, apenas descomente a linha 63 do arquivo /etc/nginx/passenger.conf
# descomente a linha 63: include /etc/nginx/passenger.conf
$ sudo nano /etc/nginx/nginx.conf
Feito isso, reinicie o nginx e realize os testes para verificar se o Passenger está funcionando.
$ sudo service nginx restart
$ sudo /usr/bin/passenger-config validate-install
$ sudo /usr/sbin/passenger-memory-stats
Neste momento, todas as aplicações necessárias estão instaladas e configuradas. Basta configurar a aplicação que desejamos realizar o deploy.
$ sudo mkdir -p /var/www/movie-store
$ sudo chown vagrant: /var/www/movie-store
$ cd /var/www/movie-store
$ git clone https://github.com/alexkutzke/movie-store-final.git code
# Se desejar, altere no nome da gemset com $ nano code/.ruby-gemset
$ cd code
$ gem install bundle
$ bundle install --deployment --without development test
É necessário gerar uma chave secreta para a aplicação.
$ bundle exec rake secret
Copie a chave gerada na linha 22 do arquivo config/secrets.yml
.
$ sudo nano config/secrets.yml
Essa linha ficará parecida com essa:
secret_key_base: 0616804aa992b912f14ac7f6d6b9377122ac55a80eaca0d9bd25964735792f3dfd16ec4dfeae77610e0c5c694ca161cd608e6ec3b6c1abc46051c060c635b091
Proteja os diretórios config e db da sua aplicação.
$ chmod 700 config db
$ chmod 600 config/database.yml config/secrets.yml
Précompile os assets da sua aplicação e configure o banco de dados. Para mais informações sobre assets, consulte http://guides.rubyonrails.org/asset_pipeline.html
$ bundle exec rake assets:precompile db:migrate db:seed RAILS_ENV=production
É necessário informar ao nginx onde a aplicação está armazenada. Para isso, execute o seguinte comando e verifique a linha com informações sobre nginx.
$ passenger-config about ruby-command
Essa linha será utilizada para preencher o arquivo de configuração da aplicação no nginx:
sudo nano /etc/nginx/sites-enabled/movie-store.conf
Copie o seguinte conteúdo ao arquivo. Na linha que contém "passenger_ruby", substitua pela saída do comando passenger-config
.
server {
listen 80;
server_name 127.0.0.1;
# Tell Nginx and Passenger where your app's 'public' directory is
root /var/www/movie-store/code/public;
# Turn on Passenger
passenger_enabled on;
passenger_ruby /home/vagrant/.rvm/gems/ruby-2.3.3@movie_store_deploy/wrappers/ruby;
}
Reinicie o nginx mais uma vez e pronto.
$ sudo service nginx restart
Para testar a aplicação, execute:
$ curl http://127.0.0.1
Para executar a aplicação no navegador da sua máquina nativa, não esqueça de adicionar o redirecionamento da porta 80 no arquivo Vagrantfile
.
Para alterar o banco de dados utilizado, copie o seguinte conteúdo para o arquivo config/database.yml
:
# mysql
# config/database.yml
default: &default
adapter: sqlite3
pool: 5
timeout: 5000
development:
<<: *default
database: db/development.sqlite3
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: db/test.sqlite3
production:
adapter: mysql2
database: movie-store-production
user: root
password: root
Prepare o banco de dados mais uma vez e reinicie a aplicação:
$ bundle exec rake db:setup RAILS_ENV=production
$ touch tmp/restart.txt
Gems interessantes para deploy: