Continuando A Saga Sobre Ajax E Rails

Bom pessoal, demorei um pouco a fazer outro post devido ter me mudado para o Rio de Janeiro lol, trabalhando aqui agora. Não sei se posso falar a empresa que estou agora, ah vou falar rs. Bom fui contratado pela Helabs empresa do Sylvestre Mergulhão e Rafael Lima. Não tenho nem palavras para expressar a felicidade, que dizer tenho sim “lol”. Será um experiência única então vamos ao post.

Antes de começar esse post você deve seguir esse aqui e esse outro

Depois de completar os 2 posts acima, iremos colocar nosso projeto ajax e rails para exibir as mensagens de erro ao criar um post, bem como a mensagem flash. Não é nada muito complicado so iremos fazer uma simples condição no arquivo /views/post/create.js.erb, adicionar uma nova div no form que irá exibir a mensagem de erro, adicionar a div para flash_notice na index de post e uma pequena alteração no controller de post ao criar um.

Vamos comerçar com a parte de mensagem de erro, hum bom vamos fazer tudo logo, assim era como estava o arquivo create.js.erb de post:

1
2
3
$('#comments').prepend('<%= escape_javascript(render(@comment)) %>');
$('#comments > li').first().effect('highlight', {color: 'cyan', mode: 'show'}, 2000);
$('#comment_form > form')[0].reset();

Alteramos para:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<% if @post.errors.any? -%>
  /*Hide the flash notice div*/
  $('#flash_notice').hide(300);

  /*Update the html of the div post_errors with the new one*/
  $('#post_errors').html('<%= escape_javascript(error_messages_for(@post))%>');

  /*Show the div post_errors*/
  $('#post_errors').show(300);
<% else -%>
  /*Hide the div post_errors*/
  $('#post_errors').hide(300);

  /*Update the html of the div flash_notice with the new one*/
  $('#flash_notice').html('<%= escape_javascript(flash[:notice])%>');

  /*Show the flash_notice div*/
  $('#flash_notice').show(300);

  $('#posts').prepend('<%= escape_javascript(render(@post)) %>');
  $('#posts > li').first().effect('highlight', {color: 'cyan', mode: 'show'}, 2000);
  $('#post_form > form')[0].reset();

<% end -%>

Aqui eu ja inclui a parte para exibir a mensagem flash, veja que agora nós temos uma condição, que verifica se algum erro foi lançado, se existe ele dar um hide na div de flash_notice, atualiza nossa div de post_erros com o helper que eu criei aqui e exibe-a em seguida, senão ele da um hide na div de post_erros, atualiza a div da mensagem flash, mostra o objeto criado e limpa o formulário.

Com nosso arquivo create.js.erb no ponto, vamos adicionar as divs nas views, primeiro abra o form de post e deixe-o assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%= form_for(@post, :remote => true) do |f| %>

  <div id= "post_errors" style="display:none"></div>

  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Nossa única alteração foi a inclusão da div para exibir as mensagens de erro. Em seguida vamos abrir a index de post e incluir a div para a mensagem flash:

1
2
3
4
5
6
7
8
9
10
11
12
<div id="flash_notice" style="display:none"></div>

<h1>Posts</h1>
<div id="timer">Rendered at: <%= Time.now %></div> 
 
<div id="post_form">
  <%= render 'form' %>
</div>
 
<ul id="posts">
  <%= render :partial => @posts.reverse %>
</ul>

E finalizando abra o controller de post e deixei-o assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  def create
    @post = Post.new(params[:post])

    respond_to do |format|
      if @post.save
        format.html { redirect_to posts_url }
        format.json { render json: @post, status: :created, location: @post }
        format.js
        flash[:notice] = 'Post was successfully created.'
      else
        format.html { render action: "index" }
        format.json { render json: @post.errors, status: :unprocessable_entity }
        format.js
      end
    end
  end

Fiz uma pequena alteção, pois como estava antes não exibia a mensagem flash. Agora você ja pode verificar se esta exibindo ou não as mensagens de erro e mensagem flash, lembrando que você deve seguir esse aqui e esse outro, antes de começar aqui.

Simples e fácil lol


Mensagem De Erro De Validação Em Rails Como Um Helper

Estava eu tentando deixar mais dry meu código quando encontrei esse Episodio no asciicasts

Por padrao o rails gera mais ou menos isso dentro de cada form:

1
2
3
4
5
6
7
8
9
10
<% if @objeto.errors.any? %>  
  <div id="errorExplanation">
    <h2><%= pluralize(@objeto.errors.count, "error") %> prohibited this objeto from being saved:</h2>  
    <ul>  
    <% @objeto.errors.full_messages.each do |msg| %>  
      <li><%= msg %></li>
    <% end %>  
    </ul>
  </div>  
  <% end %>

Ai eu disse nossa que maravilha esse episodio. Só que pensando um pouco mais: Hum vou ter que criar uma pasta e depois uma view para fazer isso em meus projetos e ainda assim chamar dentro de cada form:

<%= render "shared/error_messages", :target => @user %>

Dai eu disse: Hum vou fazer um helper para isso e chama-lo em cada form:

1
2
3
4
5
6
7
8
9
10
11
12
13
def error_messages_for(target)       
  html = ""
  if target.errors.any?         
      html << "<div id='error_explanation'>
     <h2>#{pluralize(target.errors.count, 'error')} prohibited this record from being saved:</h2>  
     <ul>"
      target.errors.full_messages.each do |msg|
          html << "<li>#{msg}</li>"
      end
      html << "</ul></div>"
  end
  html.html_safe
end

Coloquei o nome de error_messages_for por que foi retirado do rails 3 senão me engano, bom alguem ja deve ter feito isso, mas fica ai a dica. Simples e fácil lol.


Sobre O Autor Do Blog

NO SABADO PARA DOMINGO

Fim de semana chegou e estou bastante entusiasmado com a volta aos estudos com testes em rails, passei de sabado para domingo acordado tirando umas dúvidas e como sempre, muitas ideias aparecendo e uma delas ja pela manha de domingo, puts eu ainda acordado, foi fazer um post sobre minha pessoa, pricipalmente na parte de desenvolvimento. Então vamos lá.

UM POUCO SOBRE MINHA VIDA ANTES DA FACULDADE

Queria começar agradecendo aos meus pais por sempre darem do bom e do melhor, não so nos estudos, mas em tudo mesmo, não tenho do que reclamar, esse foi um dos motivos de passar por varias escolas, dentre elas não posso esquecer do colegio Marista São Pio X em Balsas-MA, foi uma infancia fantastica. Até o fim do ensino médio, minha vida era so estudos, estudos mesmo, tinha o tempo de diversão, mas somente nas ferias rs. Tentando sempre dar o melhor de mim e mostrar aos meus pais que o que eles estavam fazendo era o melhor, apesar de todos falarem que era loucura o que estavam fazendo (Colocar eu e minha irma em outra cidade sozinhos para estudar, isso com 12 anos), que não iriamos dar valor. Fiz o melhor de mim, em todas as escolas que frequentei eu era um dos melhores alunos nao so nas nostas, como tambem no comportamento, algo que acabou refletindo na faculdade. Até aqui eu nao sabia nada de computadores, mas queria ser cientistas lol.

OS LONGOS E INESQUECIVEIS 5 ANOS DA FACULDADE

Antes de começar a faculdade eu mal sabia pegar em um mouse, escolhi o curso de Sistemas de Informação pela afinidade com a area de exatas, mas sabia qual era o focu do curso. Logo tudo que eu aprendi sobre desenvolvimento foi dentro da faculdade, onde apresentei meu TCC no ano de 2010. Estagiei em 4 empreas, as 2 primeiras dando aula de informatica basica, a 3ª e 4ª com desenvolvimento, comecei na 4ª empresa no inicio do ano de 2010, na qual depois de fazer uma pesquisa em qual linguagem iriamos desenvolver um sistema web (Java ou Ruby), o Dono acabou optando por Ruby, foi ai meu primeiro contato com a linguagem, cerca de 18 horas de aulas, agradeço a paciencia do Lucas de Castro, que ministrou o curso, nossa enchi muito o saco dele, rs. Depois do curso tivemos que desenvolver o sistema web com framework Ruby on Rails, esse sistema nao terminamos, mas ainda consegui desenvolver nos 3 meses de estagio outros dois sistemas. Até aqui eu nao sabia nada de teste com ruby, nem mesmo com rails. Fiquei ate o meio do ano de 2010 desenvolvendo meu TCC, um pequeno aplicativo mobile usando JME, que por fim foi apresentado ainda no meio do ano.

O MEU PRIMEIRO EMPREGO

Como era periodo de eleição, pedi aos meu pais para ficar na minha cidade ate o termino da mesma. Depois voltei a capital (Teresina) e reiniciei os estudos em Ruby e Ruby on Rails, onde enchi muito o saco do pessoal do GuruPI (Grupo de Usuarios de Ruby do Piauí), principalmente no nosso grupo do google, em especial o Cairo Noleto kkkkkkkkk. Surgiu uma oportunidade no grupo, enviei meu curriculo, la estava eu na entrevista lol, fiquei cerca de 3 meses em teste e 5 meses como efetivo. Desenvolvi 2 sistemas, como eu tinha tempo para estudar dentro da empresa, tive a iniciativa de começar a desenvolver os testes, em um deles fiz 80% dos testes dos controllers, mas acabei saindo da empresa por forças maiores, meus pais queriam me levar para minha cidade, e para eu ficar em Teresina, teria que me bancar. Fui a 2 entrevista e acabei ficando la, rs, foi muito engraçado a entrevista nesse empresa que me contratou, pegaram uma cadeira, me colocaram na frente do pc e eu ja estava ali lol, desenvolvendo, ja participei em N sistemas aqui e hoje alem de continuar desenvolvendo novos sistemas, faço a manutenção, na parte de codificar, do nosso principal sistema. Na empresa eu sou o menos experiente em desenvolvimento, mas acredito que seja o maior conhecedor na linguagem Ruby e framework Ruby on Rails. Estou hoje com 2 anos que conheço a linguagem e framework e com 6 meses que estudo testes, que seria desde quando entrei aqui, apesar do pessoal não praticar, algo que não dar para entender.

MEU EU lol

Não bebo (bebidas alcoolicas), não fumo, nunca usei drogas, sou catolico não muito praticante e amo minha Dondonzinha. Esse sou eu tentando sempre ser o melhor no que faço.


Básico de Jquery e Ajax Em Rails

Este post tem por base o tutorial do rehali. Então antes de começar você deve fazer primeiro o post dele. Seguindo sua linha de programação neste post irei implementar a funcionalidade de inserir os comentários em um artigo(post), com as mesmas funcionalidades que o rehali usou em seu artigo: Jquery e Ajax.

Vamos as alterações no post do rehali, para em seguida implementar a nova funcionalidade de adicionar comentarios ao artigo.

Abra o model de Post e adicione o seguinte metodo:

1
2
3
def info
  "#{title} - [#{email}]"
end

Agora abrimos o arquivo views/posts/_post.html.erb e modificamos a segunda linha, ficando agora assim:

1
2
3
4
5
6
<%= content_tag_for(:li, post) do %>
  <p class="title"><%= link_to post.info, post %></p>
  <p class="content"><%= truncate post.content %></p>
  <span class="posted_at">Posted at <%= time_ago_in_words(post.created_at) %> ago.
  (<%= link_to 'Delete', post, :confirm => 'Are you sure?', :method => :delete, :remote => true%>)</span>
<% end %>

Aqui concluímos as alterações necessarias no post do rehali, para colocarmos os comentarios. Mãos a obra lol.

Criamos o scaffold de comentarios e geramos sua tabela:

rails g scaffold comment emai:string message:text references:post
rake db:migrate

Abra o model de post e o arquivo config/routes.rb e adicione respectivamente:

has_many :comments #model post

resources :posts do #aquivo routes
  resources :comments
end

Em seguida crie a partial que irá mostrar os comentarios dentro da pagina do artigo com o nome de _comment.html.erb dentro da pasta views/comments com o seguinte código:

1
2
3
4
5
<%= content_tag_for(:li, comment) do %>
  <p class="title"><%= comment.email %>: <%= comment.message %></p>
  <span class="posted_at">Posted at <%= time_ago_in_words(comment.created_at) %> ago.
  (<%= link_to 'Delete', comment, :confirm => 'Are you sure?', :method => :delete, :remote => true%>)</span>
<% end %>

Continuando, crie os arquivos create.js.erb e destroy.js.erb dentro da pasta views/comments com o seguinte código, respectivamente:

1
2
3
$('#comments').prepend('<%= escape_javascript(render(@comment)) %>');
$('#comments > li').first().effect('highlight', {color: 'cyan', mode: 'show'}, 2000);
$('#comment_form > form')[0].reset();
1
$('#<%= dom_id(@comment) %>').effect('highlight', {color: 'green', mode: 'hide'}, 1200);

Abra o form de comentarios e deixe-o assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
<%= form_for([@post, Comment.new], :remote => true) do |f| %>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.label :message %><br />
    <%= f.text_area :message %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Em seguida vamos modificar o controller de comentarios, especificamente as actions create e destroy:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class CommentsController < ApplicationController
  respond_to :js

  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment])
    respond_with(post_path(@post))
  end

  def destroy
    @comment = Comment.find(params[:id])
    @comment.destroy
    respond_with(post_path(@comment.post))
  end
end

E para quase finalizar vamos abrir a view show de post e deixa-la exatamente assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<div id="timer">Rendered at: <%= Time.now %></div> 

<p>
  <b>Title:</b>
  <%= @post.title %>
</p>

<p>
  <b>Email:</b>
  <%= @post.email %>
</p>

<p>
  <b>Content:</b>
  <%= @post.content %>
</p>

<h2>Add New Comment</h2>
<div id="comment_form">
 <%= render 'comments/form' %>
</div>

<ul id="comments">
 <%= render @post.comments.reverse %>
</ul>

<%= link_to 'Edit', edit_post_path(@post) %> |
<%= link_to 'Back', posts_path %>

Quase tudo pronto. Aproveitando o css do artido do rehali, abra o arquivo assets/stylesheets/comments.css.scss e adicione o seguinte código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
html, body {
  font-family: Arial;
  font-size: 12px;
}

textarea {
  font-family: Arial;
  font-size: 12px;
  width: 500px;
  height: 100px;
  padding-bottom: 8px;
}

.textfield{
  font-family: Arial;
  font-size: 14px;
  width: 300px;
  padding-bottom: 8px;
  border: 1px solid black;
}

#comments ul {
  margin: 0;
  padding: 0;
}

#comments li {
  margin-left: -30pt;
  margin-bottom: 16px;
  padding: 8px;
  list-style: none;
  border: 1px solid #ccc;
}

#comments p {
  margin: 0;
}

#comments .title {
  font-size: 13px;
  font-weight: bold;
}

#comments .content {
  font-size: 12px;
  margin-top: 10px;
  margin-bottom: 10px;
}

.posted_at {
  font-size: 8pt;
  text-decoration: italic;
  margin-bottom: 8px;
}

#timer {
  font-size: 8pt;
  text-decoration: italic;
}

Agora é so abrir o terminal e executar rails s. Simples e fácil lol.


Preenchendo ComboBox Com Cidades De Acordo Com O Estado Selecionado Em Rails

Vamos criar nossa aplicação e para ir mais rapido o scaffold de city, state e user.

rails new cities_by_state
rails g scaffold state name:string
rails g scaffold city name:string state:references
rails g scaffold user name:string city:references
rake db:migrate
rm public/index.html

Abra o arquivo config/routes.rb e defina a pagina de user como inicial:

root :to => 'users#index'

Agora vamos starta a aplicação lol:

rails s

Abra agora o arquivo db/seeds.rb e adicione as seguinte linhas, para popular nosso banco:

1
2
3
4
5
6
7
states = State.create([{:name => 'Piauí'}, {:name => 'Maranhão'}, {:name => 'Pernambuco'}])

City.create([
              {:name => 'Ribeiro Gonçalves', :state => states.first},
              {:name => 'Uruçuí', :state => states.first},
              {:name => 'Teresina', :state => states.first}
          ])

Execute o seguinte comando no terminal:

rake db:seed

Agora vamos abrir o arquivo _form.html.erb de user e colocar o combobox de state e city:

1
2
3
4
5
6
7
8
9
<div class="field">
    <%= f.label :state %><br />
    <%= collection_select(:state ,:id, State.all, :id, :name, :include_blank => 'SELECT A STATE') %>
  </div>

<div class="field">
   <%= f.label :city %><br />
   <%= f.collection_select :city_id, City.all, :id, :name, :include_blank => 'SELECT A CITY' %>
</div>

Ainda não esta como queremos, então vamos fazer o metodo que irá buscar as cidades quando o combobox de estados for modificado, abrimos então o controller cities e adicionamos o seguinte código:

1
2
3
4
5
6
7
8
9
  def cities_by_state
    state_id = params[:id].to_i
    cities = City.where(:state_id => state_id)
    cty = []
    cities.each do |city|
      cty << {:id => city.id, :n => city.name}
    end
    render :json => {:cty => cty.compact}.as_json
  end

Uma pequena modificação no arquivo config/routes.rb é necessária, pois temos que adicionar a rota para nosso metodo criado:

match "/cities_by_state" => "cities#cities_by_state"

O metodo cities_by_state simplesmente recebe um parametro enviado via js e faz uma busca de todas as cidades em relação ao id do estado que foi enviado, retornando um arquivo json com o id e nome das cidades.

Quase finalizando criaremos agora nossos metodos js para fazer a busca e preenchimento ao modificar o combobox de estado. Adicione no final do arquivo _form.html.erb de user:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script type="text/javascript">
  $(document).ready(function() {
   $("#state_id").change(function() {
      getCitiesByState("id="+$("#state_id").val());
    });
  });

  function getCitiesByState(id) {
    $.getJSON("/cities_by_state", id, function(j) {
      var options = '<option value="">SELECT A CITY</option>';
      $.each(j.cty, function(i, item) {
        options += '<option value="' + item.id + '">' + item.n + '</option>';
      });
      $("#user_city_id").html(options);
    });
  }
</script>

O primeiro metodo chama o segundo se o estado do combobox for modificado. O segundo metodo retorna as cidades referente ao estado selecionado no combobox e preenche o combobox com suas cidades.

Agora finalizando vamos modificar o combobox de cities para não exibir as cidades ao entar no form de usuarios, esperando o usuario selecionar primeiro um estado. O combobox deve ficar assim:

1
2
3
4
<div class="field">
   <%= f.label :city %><br />
   <%= f.collection_select :city_id, [], :id, :name, :include_blank => 'SELECT FIRST STATE' %>
</div>

Simples e fácil lol.


Algumas Dicas Ao Usar Rails E Rspec

Antes de começar seria bom dar uma olhada nesse meu post

Esperando que você tenha lido o post do link acima, vamos fazer uma pequena modificação no arquivo gemfile, ficando agora assim:

1
2
3
4
5
group :development, :test do
  gem "rspec-rails", "~> 2.6"
  gem 'guard'
  gem 'guard-rspec'
end

Agora o porque de ter adicionado o :development, foi simplesmente para termos alguns benefícios do Rspec, onde ao criarmos um model, controller ou o próprio scaffold, também será gerado seus arquivos de teste.

Faça os seguintes comandos e veja as saídas:

rails g controller post index
rails g model post title:string body:text
rails g scaffold post title:string body:text

Se tudo ocorreu como o esperado você dete ter visto pelo menos esta saída:

invoke  active_record
create    db/migrate/20120327143756_create_posts.rb
create    app/models/post.rb
invoke    rspec
create      spec/models/post_spec.rb

Observe que foi criado um arquivo post_spec.rb dentro da pasta spec/models.

Pegando como exemplo somente o comando de criação do model, se executarmos o comando guard, devemos ter a seguinte saída:

Pending:
Post add some examples to (or delete) /home/rogerio/projetos/rspec_test/spec/models/post_spec.rb
    # No reason given
    # ./spec/models/post_spec.rb:4

Finished in 0.00026 seconds
1 example, 0 failures, 1 pending
Bye bye...

Acima ele diz que existe uma pendência, isto é claro, pois temos somente um arquivo base para criarmos nossos testes, então vamos colocar uma simples validação dentro do model post:

validate_presence_of :title

Essa validação diz que não é possivel cadastrar um post com título em branco, vamos fazer o teste para criar um Post.

1
2
3
4
5
6
describe Post do
  it "should be valid" do
      @post = Post.create(:title => "My first Post")
      @post.should be_valid
  end
end

Agora vamos preparar nosso banco de dados para executar o teste, abra o terminal e execute o comando:

rake db:migrate RAILS_ENV=test

Logo em seguida execute o comando guard, certamente nosso teste irá passar, vamos fazer a seguinte modificação na validação, de modo que irá quebrar nosso teste, adicione depois do campo title, o body, ficando assim:

validate_presence_of :title, :body

Agora nosso teste não esta passando, então vamos arrumar isso, ficando agora assim:

1
2
3
4
5
6
describe Post do
  it "should be valid" do
      @post = Post.create(:title => "My first Post", :body => 'Help me')
      @post.should be_valid
  end
end

Vamos adicionar um teste que verifica se o title esta nil:

1
2
3
4
5
6
7
8
9
describe Post do
  it "should be invalid without a title" do
      @post = Post.create(:title => nil, :body => "Help me")
      #@post.should be_invalid(:title) uma pequena correção aqui bem observada pelo
      #companheiro de trabalho Pedro Nascimento, be_invalid é usando com callbacks, o correto
      #é assim:
      @post.should_not be_valid
  end
end

E este é nosso arquivo final:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
describe Post do
  it "should be valid" do
      @post = Post.create(:title => "My first Post", :body => "Help me")
      @post.should be_valid
  end

  it "should be invalid without a title" do
      @post = Post.create(:title => nil, :body => "Help me")
      #@post.should be_invalid(:title) uma pequena correção aqui bem observada pelo
      #companheiro de trabalho Pedro Nascimento, be_invalid é usando com callbacks, o correto
      #é assim:
      @post.should_not be_valid
  end
end

Ficam as dicas:

Ao ver o before em um teste fique sabendo que ele contem condições que serão executadas antes do teste.

O it é sempre uma especificação, normalmente validando algo, que sempre esta associada a um describe.

O describe contem uma ou várias especificações, validando no final um determinado contexto.

Tente fazer seus teste sempre em inglês.

Faça primeiro os testes, depois code.

Além disso, poderiamos deixar o código mais dry usando o remarkable ou shoulda, que podemos integrar com o rspec, facilitando quando vamos fazer validação, um exemplo esta logo abaixo de como seria escrito o teste para validar o título do post:

it {should validate_presence_of :title }

Simples e fácil lol.


Devise - Bloqueando O Acesso Do Usuário Ao Sistema

O Devise tem um método chamado active_for_authentication, o qual dá permissão ao usuário de logar no sistema. Vamos sobrescreve-lo no model User e assim termos o poder de bloquear um usuário. Antes de ir ao código vamos escrever o teste:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Test

require 'spec_helper'

describe Devise::SessionsController do
  include Devise::TestHelpers

  before do
    @user = Factory(:confirmed_user, :active => false)
    request.env["devise.mapping"] = Devise.mappings[:user]
  end

  it 'will not sign user in if not active' do
    post :create, :user => {:password => "password", :email => @user.email}
    controller.should_not be_user_active
  end
end

O teste simplesmente nos mostra uma mensagem se o usuario não tiver permissão de login, agora vamos coda. Criamos uma migration adicionando um campo com o nome de active do tipo boolean:

rails g migration Add_active_To_User active:boolean
rails rake db:migrate

Agora adicionamos o método active_for_authentication, bem como o inactive_message, que irá exibir uma mensagem se o usuário estiver bloquedo. Isso dentro do model User, não esqueça.

1
2
3
4
5
6
7
8
9
# User model

def active_for_authentication?
  active
end

def inactive_message
  "Sorry, this account has been deactivated."
end

Simples e fácil, agora é so fazer uma action para ficar mudando de false para true o campo active.


Preparando Sua Aplicação Rails Para Testes Com Guard e Rspec

Guard

É uma ferramente de linha de comando que nos ajuda a lidar com eventos sobre modificações em arquivos.

Rspec

É um framework BDD, feito em Ruby, que nos permite escrever testes.

Vamos começar, criamos nossa aplicação, logo em seguida abrimos o arquivo Gemfile e adicionamos o seguinte grupo:

1
2
3
4
5
group :test do
  gem "rspec-rails", "~> 2.6"
  gem 'guard'
  gem 'guard-rspec'
end

Abra o terminal e execute o comando:

bundle install

Ainda com terminal aberto, com os respectivos comandos, logo abaixo, vamos gerar uma arquivo Guardfile e o diretório spec com os arquivos necessário para começar com os testes.

guard init
rails generate rspec:install

Fácil não ? Sua aplicação agora esta pronta para aceitar seus testes, comece a escrevê-los

Para dar inicio à ferramenta guard é so ir até a raiz da aplicação Rails e executar o seguinte comando:

guard

Simple e fácil lol.


Criando Sua Primeira Gem Parte 3

Agora entramos na parte de teste, então porque fazer testes ? Teste é extremamente importante, pois não só garante que seu código funcione, como ajuda aos outros a saberem que sua gem irá fazer o serviço lol.

Antes de começar dê uma olhada Criando Sua Primeira Gem Parte 1

Começamos adicionando um arquivo com o nome Rakefile, que nos permitirá automatizar os testes:

touch Rakefile

Agora colocamos um pouco de código no arquivo:

1
2
3
4
5
6
7
8
require 'rake/testtask'

Rake::TestTask.new do |t|
  t.libs << 'test'
end

desc "Run tests"
task :default => :test

E agora vamos criar uma pasta com o nome test e um arquivo como o nome test_miguxo_gem.rb:

mkdir test
cd test
touch test_miguxo_gem.rb

Colocamos um pouco de código no arquivo test_miguxo_gem.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# -*- coding: utf-8 -*-
require 'test/unit'
require 'miguxo_gem'

class MiguxoTest < Test::Unit::TestCase
  def test_dmitrynix_miguxo
    assert_equal "Olá Miguxito Mestre em Testes lol",
      Miguxo.xaudacao(:dmitrynix)
  end

  def test_caironoleto_miguxo
    assert_equal "Olá Miguxito Mestre em Rails lol",
      Miguxo.xaudacao(:caironoleto)
  end

  def test_infoslack_miguxo
    assert_equal "Olá Miguxito Mestre em Sugurança lol",
      Miguxo.xaudacao(:infoslack)
  end

  def test_leandrosales_miguxo
    assert_equal "Olá Miguxito Mestre em Sacanagem lol",
      Miguxo.xaudacao(:leandrosales)
  end

  def test_weldyss_miguxo
    assert_equal "Olá Miguxito Chefe lol",
      Miguxo.xaudacao(:weldyss)
  end

  def test_any_ola_miguxo
    assert_equal "Olá Miguxito",
      Miguxo.xaudacao("rails")
  end

end

Nossa nova estrutura deve ficar assim:

% Nova estrutura
.
├── Rakefile
├── miguxo_gem.gemspec
├── lib
│   ├── miguxo
│   │   └── miguxito.rb
│   └── miguxo_gem.rb
└── test
    └── test_miguxo_gem.rb

Pronto agora sua gem já esta com os testes, vamos executar, abra o terminal e digite:

rake test

A saída deve ser a seguinte:

Run options: 

# Running tests:

......

Finished tests in 0.000863s, 6950.5423 tests/s, 6950.5423 assertions/s.

6 tests, 6 assertions, 0 failures, 0 errors, 0 skips

Simples e fácil lol.


Instalação Lua Ubuntu 11.10

A empresa na qual trabalho resolveu partir para o desenvolvimento em TV Digital. Resolvi começar a estudar sobre a linguagem que iremos usar. Até o momento nenhuma dificuldade, logo abaixo irei mostrar como instalar no linux, algo que foi bem simples, mas antes uma breve descrição sobre a linguagem.

"Lua é uma linguagem de programação leve e poderosa. Projetada por uma equipe do 
laboratório Lablua da PUC-Rio, nasceu e cresceu dentro do Tecgraf desde 1993.
Lua é FOSS, registrada sob a licença GNU/GPL. Em um vislumbre superficial Lua 
pode parecer uma linguagem de mercado reduzido, mas esta é uma primeira impressão
equivocada. Isto ocorre porque Lua é uma linguagem internacional. Lua é muito 
usada como linguagem de extensão para motores de jogos e está agora ganhando 
força no mercado de aplicações web devido ao Projeto Kepler. Além da 
PUC-Rio e da Petrobrás, um exemplo de companhia que usa amplamente a linguagem
é a Lucas Arts."

Começando a instalação, abra o terminal e digite os seguintes comandos:

sudo apt-get update
sudo apt-get install liblua5.1-0 liblua5.1-0-dev lua5.1

Vamos testar, digite no terminal: lua, deve aparecer a seguinte saída:

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> 

Vamos ao nosso velho ‘hello word’

print 'hello word'

Se tudo deu certo ele deve imprimir “hello word” logo abaixo. Simple e fácil.