Skip to content

Latest commit

 

History

History
370 lines (259 loc) · 10.5 KB

08.md

File metadata and controls

370 lines (259 loc) · 10.5 KB

Logo do Curso

<< Voltar

Material da aula 08

Temas:

  • Internacionalização
  • Testes
  • Deploy

Internacionalização

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:

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!

Testes

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:

Deploy

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.

Utilizando o mysql

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: