Criando Sua Primeira Gem Parte 2

Continuando com o post Criando Sua Primeira Gem Parte 1 iremos agora adicionar algumas funcionalidades para nossa gem.

Abrimos o arquivo miguxo_gem.rb que se encontra na pasta lib e adicionamos 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
# -*- coding: utf-8 -*-
class Miguxo
  def self.xaudacao(miguxito = "ola_miguxo")
    miguxitor = Miguxitos.new(miguxito)
    puts miguxitor.xaudacao
  end
end

class Miguxo::Miguxitos
  def initialize(miguxito)
    @miguxito = miguxito
  end

  def xaudacao
    case @miguxito
    when "dmitrynix"
      "Olá Miguxito Mestre Teste"
    else
      "Olá Miguxito"
    end
  end
end

Agora vamos criar uma pasta com o nome miguxo dentro da pastar lib e criar um arquivo chamado miguxitos.rb e colocar a classe que esta logo abaixo da miguxo dentro dele, com os seguintes comandos:

mkdir miguxo
cd miguxo
touch miguxito.rb

% Nova estrutura
.
├── miguxo_gem.gemspec
└── lib
    ├── miguxo
    │   └── miguxitos.rb
    └── miguxo_gem.rb

As classes miguxo.rb e miguxo/miguxitos.rb ficam assim respectivamente:

1
2
3
4
5
6
class Miguxo
  def self.xaudacao(miguxito = :ola_miguxo)
    miguxitor = Miguxito.new(miguxito)
    puts miguxitor.xaudacao
  end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Miguxo::Miguxito
  def initialize(miguxito)
    @miguxito = miguxito
  end

  def xaudacao
    case @miguxito
    when :dmitrynix
      "Olá Miguxito Mestre em Testes lol"
    when :caironoleto
       "Olá Miguxito Mestre em Rails lol"
    when :infoslack        
       "Olá Miguxito Mestre em Sugurança lol"
    when :leandrosales
       "Olá Miguxito Mestre em Sacana lol" 
    when :weldyss
       "Olá Miguxito Chefe lol"    
    else
       "Olá Miguxito"
    end
  end
end

Agora vamos alterar o arquivo gemspec, ficando agora assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Gem::Specification.new do |s|
  s.name = %q{miguxo_gem}
  s.author = 'Rogerio Medeiros'
  s.version = "0.0.1"
  s.date = %q{2012-03-06}
  s.summary = %q{Miguxo!}
  s.description = "Uma simples gem chamada miguxo_gem"
  s.email       = 'argerim@gmail.com'
  s.homepage    =
    'http://heroku.rogeriolol.com'
  s.files = [
    "lib/miguxo_gem.rb"
  ]
  s.require_paths = ["lib"]
end

Gerando a nova versão da gem e instalando:

gem build miguxo_gem.gemspec
gem install miguxo_gem-0.0.1.gem

Agora vamos executar com o camando abaixo:

1
2
3
4
5
irb -Ilib -rmiguxo_gem
:001 > Miguxo.xaudacao(:dmitrynixx)
 => "Olá Miguxito"
:002 > Miguxo.xaudacao(:dmitrynix)
 => "Olá Miguxito Mestre Teste"

O comando -Ilib é para ele incluir o diretório lib, na próxima parte faremos os testes, simples e fácil lol.

Criando Sua Primeira Gem Parte 3


Metas A Cumprir Em 2012

-Comprar um carro lol

-Fazer especialização lol

-Desenvolver uma aplicação mobile lol

-Independência financeira lol

-Viagem com a namorada lol

-Dar inicio à compra da casa ou apt lol

-Ganhar mais dinheiro lol


Criando Sua Primeira Gem Parte 1

Nesse post irei demonstrar como é simples fazer sua própria gem. As gems são instaladas pelo gerenciador de pacotes RubyGems.

Vamos começar como o arquivo de especificação da gem, que chamamos de miguxo_gem.gemspec

Gem::Specification.new do |s|
    s.name = %q{miguxo_gem}
    s.author = 'Rogerio Medeiros'
    s.version = "0.0.0"
    s.date = %q{2012-03-06}
    s.summary = %q{Miguxo!}
    s.files = [
        "lib/miguxo_gem.rb"
    ]
    s.require_paths = ["lib"]
end

Essa é a estrutura básica para criar o arquivo gemspec.

Agora vamos criar os diretórios necessários para a gem, abra o shell e execute:

mkdir miguxo_gem
cd miguxo_gem
mkdir lib

Voltamos ao diretório raiz da gem e criamos o arquivo miguxo_gem.gemspec:

touch miguxo_gem.gemspec

Adicionamos as especificações necessarias para validá-lo:

1
2
3
4
5
6
7
8
9
10
11
12
Gem::Specification.new do |s|
  s.name = %q{miguxo_gem}
  s.author = 'Rogerio Medeiros'
  s.version = "0.0.0"
  s.date = %q{2012-03-06}
  s.summary = %q{Miguxo!}
  s.description = "Uma simples gem chamada miguxo"
  s.files = [
    "lib/miguxo_gem.rb"
  ]
  s.require_paths = ["lib"]
end

Mantendo um pouco simples, vamos até o diretório /lib e criaremos um novo arquivo:

cd lib
touch miguxo_gem.rb

Inserindo um pouco de código:

1
2
3
4
5
6
# -*- coding: utf-8 -*-
class Miguxo
  def self.xaudaxao
    puts "Olá Miguxo!"
  end
end

Tudo pronto para gerar nossa gem, então vamos ao grande e esperado comando lol, entre no diretório raiz e execute o seguinte comando lol:

gem build miguxo_gem.gemspec

Ao termino deve exibir a seguinte saída:

Successfully built RubyGem
Name: miguxo_gem
Version: 0.0.0
File: miguxo_gem-0.0.0.gem

Para instalar a gem localmente, permaneça no ditório raiz e execute o seguinte comando:

gem install miguxo_gem-0.0.0.gem

A saída deve ser a seguinte:

Successfully installed miguxo_gem-0.0.0
1 gem installed

Abra o shell e execute os seguintes comandos:

irb
require 'miguxo_gem'
Miguxo.xaudaxao

Na próxima parte iremos deixar nossa classe Miguxo ou pouco mais complexa e na última parte irei fazer os testes lol.

Simples e fácil lol.

Criando Sua Primeira Gem Parte 2


O Erro Cometido Pelo Core Team do GitHub Que Afetou O Rails

Quase todos os developers Rails sabem o que é a atribuição mass assignment, onde ao instanciar um objeto não temos a necessidade de fazer a atribuição para cada atributo do mesmo.

Bom o Core Team do GitHub não se atualizaram ou não sabiam da importância de usar ou o método :attr_protected que informa quais atributos são protegidos, ou :attr_accessible que define quais atributos podem ser usados por mass assignment.

Devido a esse esquecimento um usuário do GitHub acabou que se aproveitando e fazendo um commit no repositório do Rails sem ter a “permissão”.

Uma das gems que eu mais gosto: Devise, ja vem padrão quando nós criamos nosso model de User.

Então ja que todos nós conhecemos sobre qual a finalidade dos métodos, podemos agora colocar um deles em todos os nossos models da aplicação.

E finalizando eu irei adotar o :attr_accessible, pois sendo mais restritivo é mais seguro lol.

Simples e fácil.


Relógio Digital Para Sua App Rails Vindo do Servidor

No controller

1
2
3
def relogio_digital
   render :text => "Agora : #{Time.current.to_s}"
end

Na view

1
2
3
4
5
6
7
8
9
10
<div id="nome_da_div"></div>

<script>
 $(document).ready(
     function(){
         setInterval(function(){
             $('#nome_da_div').load('/nome_do_controller/relogio_digital');
          }, 1000);
  });
</script>

Arquivo Routes

1
get "controller/relogio_digital"

Simples e fácil lol.


Menu Com a hover e a selected Transparente

Eu queria postar o link do site, mas não me recordo, segue abaixo o código lol:

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
<style type="text/css">

ul.semiopaquemenu{ /* main menu UL */
font: bold 14px Georgia ;
width: 100%;
background: red;
padding: 6px 0 14px 0; /* padding of the 4 sides of the menu */
margin: 0;
text-align: left; /* set value to "left", "center", or "right" to align menu accordingly */
/*width:650px;*/
}

ul.semiopaquemenu li{
display: inline;
}

ul.semiopaquemenu li a{
color:#000;
padding: 6px 8px 6px 8px; /* padding of the 4 sides of each menu link */
margin-right: 15px; /* spacing between each menu link */
text-decoration: none;
}

ul.semiopaquemenu li a:hover, ul.semiopaquemenu li a.selected{
color: #000;
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjgyIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMC4xNiIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); /* IE9+ SVG equivalent  of linear gradients */
background: -moz-linear-gradient(top,  rgba(255,255,255,0.82) 0%, rgba(255,255,255,0.16) 100%); /* fade from white (0.82 opacty) to 0.16 opacity */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.82)), color-stop(100%,rgba(255,255,255,0.16)));
background: -webkit-linear-gradient(top,  rgba(255,255,255,0.82) 0%,rgba(255,255,255,0.16) 100%);
background: -o-linear-gradient(top,  rgba(255,255,255,0.82) 0%,rgba(255,255,255,0.16) 100%);
background: -ms-linear-gradient(top,  rgba(255,255,255,0.82) 0%,rgba(255,255,255,0.16) 100%);
background: linear-gradient(top,  rgba(255,255,255,0.82) 0%,rgba(255,255,255,0.16) 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#d1ffffff', endColorstr='#29ffffff',GradientType=0 );
-moz-box-shadow: 0 0 5px #595959; /* CSS3 box shadows */
-webkit-box-shadow: 0 0 5px #595959;
box-shadow: 0 0 5px #595959;
padding-top: 12px; /* large padding to get menu item to protrude upwards */
padding-bottom: 20px; /* large padding to get menu item to protrude downwards */
}

</style>

<ul class="semiopaquemenu">
<li><a href="#">Pagina Inicial</a></li>
<li><a href="#" class="selected">Pagina Selecionada</a></li>
<li><a href="#">Meu Blog</a></li>
</ul>

Chave Estrangeira No Model Em Rails

Definir uma chave estrangeira é bem simples, segue o exemplo:

1
2
3
4
5
Model_Name
  belongs_to :aluno, :class_name => "User", :foreign_key => "aluno_id"
  belongs_to :gerente, :class_name => "User", :foreign_key => "gerente_id"
  has_many :funcionarios, :class_name => "User", :foreign_key => "funcionario_id"
end

Simple e fácil lol.


Colocando FadeOut Nas FlashMessages Em Sua App Rails

Começamos abrindo o arquivo app/views/layouts/application.html.erb e adicionando o seguinte código:

1
2
3
<% flash.each do |name, msg| %>
 <%= content_tag :div, msg, :id => "flash_#{name}" %>
<% end %>

Em seguida adionamos o seguinte código JavaScript dentro do arquivo public/javascripts/application.js:

1
2
3
4
5
6
7
$(document).ready(function() {
  setTimeout(hideFlashes, 2500);
});

var hideFlashes = function() {
  $('#flash_notice, #flash_warning, #flash_alert, #flash_error').fadeOut(1500);
}

Agora é so startar a aplicação e verificar a animação, simples e fácil lol.


Traduzindo As Datas Do Octopress

A tradução é algo bem simples, abrimos o arquivo data.rb que se encontra dentro da pasta plugins.

Logo em seguida adicionamos esse métodos:

1
2
3
4
5
6
7
8
def date_pt_br(date)
  "#{date.strftime('%e').to_i} de #{month_names_pt_br(date.strftime('%m').to_i)} de #{date.strftime('%Y')}"
end

def month_names_pt_br(number)
  month_names = ['', 'Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro']
  month_names[number]
end

E finalmente modificamos o método format_date inserindo o data_pt_br:

1
2
3
4
5
6
7
8
9
10
def format_date(date, format)
  date = datetime(date)
  if format.nil? || format.empty? || format == "ordinal"
    date_formatted = date_pt_br(date)
  else
    date_formatted = date.strftime(format)
    date_formatted.gsub!(/%o/, ordinal(date.strftime('%e').to_i))
  end
  date_formatted
end

Agora é so executar rake generate e depois rake preview, simples e fácil lol.


Fazendo Uma Busca/Pesquisa Sem Criar Uma Nova Action No Controller Em Rails

Criamos um método dentro do model relacionado a pesquisa:

1
2
3
4
5
6
7
8
9
Model
  def self.search(search)
      if search.present?
          joins(:category).where('title LIKE ?', '%'+search+'%' )
      else
          joins(:category)
      end
  end
end

Agora dentro da index do controller relacionado colocamos o seguinte form:

1
2
3
4
<%= form_tag search_path, :method => 'get' do %>     
      <%= text_field_tag :search, params[:search] %>
      <%= submit_tag "Buscar/Pesquisar" %>    
<% end %>

Vamos chamar o metodo na index do controller assim:

1
2
3
def index
    @objeto = Model.search(params[:search])
end

E agora é só clicar no botão Buscar/Pesquisar, simples e fácil.