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:
<% 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:
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:
E finalizando abra o controller de post e deixei-o assim:
12345678910111213141516
defcreate@post=Post.new(params[:post])respond_todo|format|if@post.saveformat.html{redirect_toposts_url}format.json{renderjson:@post,status::created,location:@post}format.jsflash[:notice]='Post was successfully created.'elseformat.html{renderaction:"index"}format.json{renderjson:@post.errors,status::unprocessable_entity}format.jsendendend
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.
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:
12345678910
<% 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:
Dai eu disse: Hum vou fazer um helper para isso e chama-lo em cada form:
12345678910111213
deferror_messages_for(target)html=""iftarget.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.eachdo|msg|html<<"<li>#{msg}</li>"endhtml<<"</ul></div>"endhtml.html_safeend
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.
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.
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:
123
definfo"#{title} - [#{email}]"end
Agora abrimos o arquivo views/posts/_post.html.erb e modificamos a segunda linha, ficando agora assim:
123456
<%= 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">Postedat<%= 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:
12345
<%= content_tag_for(:li, comment) do %> <p class="title"><%= comment.email %>: <%=comment.message%></p><spanclass="posted_at">Postedat<%= 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:
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:1pxsolidblack;}#comments ul {margin:0;padding:0;}#comments li {margin-left:-30pt;margin-bottom:16px;padding:8px;list-style:none;border:1pxsolid#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.
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:
Agora vamos abrir o arquivo _form.html.erb de user e colocar o combobox de state e city:
123456789
<divclass="field"><%= f.label :state %><br /> <%=collection_select(:state,:id,State.all,:id,:name,:include_blank=>'SELECT A STATE')%> </div><divclass="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:
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:
1234567891011121314151617
<scripttype="text/javascript">$(document).ready(function(){$("#state_id").change(function(){getCitiesByState("id="+$("#state_id").val());});});functiongetCitiesByState(id){$.getJSON("/cities_by_state",id,function(j){varoptions='<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:
1234
<divclass="field"><%= f.label :city %><br /> <%=f.collection_select:city_id,[],:id,:name,:include_blank=>'SELECT FIRST STATE'%></div>
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:
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.
123456
describePostdoit"should be valid"do@post=Post.create(:title=>"My first Post")@post.shouldbe_validendend
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:
123456
describePostdoit"should be valid"do@post=Post.create(:title=>"My first Post",:body=>'Help me')@post.shouldbe_validendend
Vamos adicionar um teste que verifica se o title esta nil:
123456789
describePostdoit"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_notbe_validendend
E este é nosso arquivo final:
1234567891011121314
describePostdoit"should be valid"do@post=Post.create(:title=>"My first Post",:body=>"Help me")@post.shouldbe_validendit"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_notbe_validendend
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:
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:
1234567891011121314151617
# Testrequire'spec_helper'describeDevise::SessionsControllerdoincludeDevise::TestHelpersbeforedo@user=Factory(:confirmed_user,:active=>false)request.env["devise.mapping"]=Devise.mappings[:user]endit'will not sign user in if not active'dopost:create,:user=>{:password=>"password",:email=>@user.email}controller.should_notbe_user_activeendend
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.
123456789
# User modeldefactive_for_authentication?activeenddefinactive_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.
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:
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.
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: