
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Uriel Juliatti</title>
	<atom:link href="http://urieljuliatti.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://urieljuliatti.com</link>
	<description>UrielJuliatti.stub(:is_coding_passion?).and_return(true)</description>
	<lastBuildDate>Thu, 26 Jan 2012 20:57:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Criando suas próprias Gems</title>
		<link>http://urieljuliatti.com/2012/01/criando-suas-proprias-gems/</link>
		<comments>http://urieljuliatti.com/2012/01/criando-suas-proprias-gems/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 20:57:25 +0000</pubDate>
		<dc:creator>Uriel Juliatti Valle</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[gem server]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://urieljuliatti.com/?p=678</guid>
		<description><![CDATA[Mesmo com pouco tempo de desenvolvimento pude concluir que continuamente escrevia aplicações amarradas e extremamente acopladas. À medida que fui adquirindo experiência e a oportunidade de desenvolver aplicações mais robustas aqui na Giran (@giran_br), notei a urgência de  aprender a desenvolver aplicações mais flexíveis e modulares, isto é, &#8220;plugáveis&#8221;. Essa visão torna o sistema mais coeso [...]]]></description>
			<content:encoded><![CDATA[<p>Mesmo com pouco tempo de desenvolvimento pude concluir que continuamente escrevia aplicações amarradas e extremamente acopladas. À medida que fui adquirindo experiência e a oportunidade de desenvolver aplicações mais robustas aqui na <a href="http://www.giran.com.br">Giran</a> (<a href="http://www.twitter.com/giran_br">@giran_br</a>), notei a urgência de  aprender a desenvolver aplicações mais flexíveis e modulares, isto é, &#8220;plugáveis&#8221;. Essa visão torna o sistema mais coeso e com o risco de acoplamento bem menor &#8211; <em>como aconselham as boas práticas sobre a arquitetura de um projeto de sistema e a &#8220;real&#8221; Orientação a Objetos (polêmicos)..</em></p>
<p>Contudo, com esse objetivo em vista, resolvi utilizar os recursos do ruby para ir de encontro às melhores soluções. E embarcando nessa jornada comecei a dar uma pincelada sobre as solução já existentes no ruby, quando então me deparei com o mais óbvio: as <strong>gems - </strong><em>Você já fez um gem install -algumagembonitaecharmosaquevaifazertudopragente-, não é? É por aí..</em></p>
<p>Mas antes da prática, um pouco de teoria para fixar:</p>
<p><strong>RubyGems</strong></p>
<p>A descrição do site oficial diz:</p>
<blockquote><p><strong>RubyGems</strong> is a <a title="Package manager" href="http://en.wikipedia.org/wiki/Package_manager">package manager</a> for the <a title="Ruby programming language" href="http://en.wikipedia.org/wiki/Ruby_programming_language">Ruby programming language</a> that provides a standard format for distributing Ruby programs and <a title="Library (computing)" href="http://en.wikipedia.org/wiki/Library_(computing)">libraries</a> (in a self-contained format called a &#8220;gem&#8221;), a tool designed to easily manage the installation of gems, and a server for distributing them.</p></blockquote>
<p>Utilizando a referência, o <strong>RubyGems</strong> é um gerenciador de pacotes para ruby que facilita a instalação de <strong>gems. </strong>Alguns se confundem com a definição e até mesmo com a aplicação dos termos, confundindo um com o outro, mas o <strong>RubyGem</strong> é, como havia dito, o gerenciador, ou seja, a ferramenta necessária para versionar, instalar, desinstalar, listar , procurar, construir as gems, etc.</p>
<p><strong>E o que são gems?</strong></p>
<p>Bibliotecas, pacotes e até mesmo aplicações em ruby, se assim posso dizer &#8211; <em>uma gem é basicamente isso</em>. Porém, a maneira que você vai utilizar essa gem é uma questão de decisão de cada programador de acordo com a decisão de cada projeto.</p>
<p><strong>Teoria, teoria, bla bla bla.</strong></p>
<p>O principal objetivo desse post é aprender como funciona a construção de uma gem simples e como ela pode ser construída. Portanto, não terá nenhum tipo de implementação por agora. Vamos começar com o já subestimado  <strong><em>HelloWorld</em></strong> para o mundo da criação de gems. Depois dessa chuva teórica &#8211; e radioativa &#8211; abra o seu terminal crie o ambiente ruby para essa gem:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1">rvm gemset create hello_word</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">rvm gemset create hello_word</pre>
</div>
</div>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1">rvm gemset use hello_word</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">rvm gemset use hello_word</pre>
</div>
</div>
<p>Se você não sabe ou nunca utilizou o RVM, pode começar lendo <a href="https://rvm.beginrescueend.com/gemsets/basics/">aqui</a> e <a href="https://rvm.beginrescueend.com/rvm/install/">aqui</a>: O RVM irá ajudar bastante na organização dos rubies dos seus projetos.</p>
<p><strong>Criando a estrutura.</strong></p>
<p>A partir daí , passamos para a construção do esqueleto das nossas gems: Alguns preferem via shellzinho [trollface]<br />
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1">mkdir <span class="sy0">-</span><span class="kw3">p</span> hello_world<span class="sy0">/</span><span class="br0">&#123;</span>lib<span class="sy0">/</span>hello_world,test<span class="br0">&#125;</span> </pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">mkdir -p hello_world/{lib/hello_world,test} </pre>
</div>
</div>
<p>, outros preferem usar o <a href="http://github.com/technicalpickles/jeweler">Jeweler</a> &#8211; tanto para estrutura como para o manipulamento &#8211; mas eu escolhi o <a href="http://gembundler.com/">Bundler</a> - a mesma biblioteca que utilizamos no rails para instalar as dependências do Gemfile <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Portanto, caso não tiver instalado &#8211; verifique com um <em>rvm gem list</em> - utilize o comando <em>gem install bundler</em>  e com a gem já instalada, vamos criar a nossa estrutura assim: $ <strong><em>bundle gem hello_world</em></strong>:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
</pre>
</td>
<td class="de1">
<pre class="de1">create hello_world<span class="sy0">/</span>Gemfile
create hello_world<span class="sy0">/</span>Rakefile
create hello_world <span class="sy0">/</span>.<span class="me1">gitignore</span>
create hello_world<span class="sy0">/</span>hello_world.<span class="me1">gemspec</span>
create hello_world<span class="sy0">/</span>lib<span class="sy0">/</span>hello_world.<span class="me1">rb</span>
create hello_world<span class="sy0">/</span>lib<span class="sy0">/</span>hello_world<span class="sy0">/</span>version.<span class="me1">rb</span>
Initializating git repo <span class="kw1">in</span> <span class="sy0">/</span>Users<span class="sy0">/</span>urieljuliatti<span class="sy0">/</span>git<span class="sy0">/</span>hello_world</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">create hello_world/Gemfile
create hello_world/Rakefile
create hello_world /.gitignore
create hello_world/hello_world.gemspec
create hello_world/lib/hello_world.rb
create hello_world/lib/hello_world/version.rb
Initializating git repo in /Users/urieljuliatti/git/hello_world</pre>
</div>
</div>
<p><strong>Modificando o gemspec.</strong></p>
<p>O bundler criou um arquivo .<em>gemspec</em> que possui diversos dados sobre a sua gem recém criada. Algumas partes você precisa modificar, mas falarei em alguns instantes. Obtivemos o seguinte dentro do .gemspec:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="co1"># -*- encoding: utf-8 -*-</span>
$:.<span class="me1">push</span> <span class="kw4">File</span>.<span class="me1">expand_path</span><span class="br0">&#40;</span><span class="st0">&quot;../lib&quot;</span>, <span class="kw2">__FILE__</span><span class="br0">&#41;</span>
<span class="kw3">require</span> <span class="st0">&quot;hello_world/version&quot;</span>
&nbsp;
<span class="re2">Gem::Specification</span>.<span class="me1">new</span> <span class="kw1">do</span> <span class="sy0">|</span>s<span class="sy0">|</span>
s.<span class="me1">name</span> = <span class="st0">&quot;hello_world&quot;</span>
s.<span class="me1">version</span> = <span class="re2">HelloWorld::VERSION</span>
s.<span class="me1">platform</span> = <span class="re2">Gem::Platform::RUBY</span>
s.<span class="me1">authors</span> = <span class="br0">&#91;</span><span class="st0">&quot;Seu nome&quot;</span><span class="br0">&#93;</span>
s.<span class="me1">email</span> = <span class="br0">&#91;</span><span class="st0">&quot;Seu email&quot;</span><span class="br0">&#93;</span>
s.<span class="me1">homepage</span> = <span class="st0">&quot;Seu Website&quot;</span>
s.<span class="me1">summary</span> = <span class="sy0">%</span>q<span class="br0">&#123;</span>Um resumo.<span class="br0">&#125;</span>
s.<span class="me1">description</span> = <span class="sy0">%</span>q<span class="br0">&#123;</span>A descrição da sua gem<span class="br0">&#125;</span>
&nbsp;
s.<span class="me1">rubyforge_project</span> = <span class="st0">&quot;hello_world&quot;</span>
&nbsp;
s.<span class="me1">files</span> = <span class="st0">`git ls-files`</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>
s.<span class="me1">test_files</span> = <span class="st0">`git ls-files -- {test,spec,features}/*`</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>
s.<span class="me1">executables</span> = <span class="st0">`git ls-files -- bin/*`</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>.<span class="me1">map</span><span class="br0">&#123;</span> <span class="sy0">|</span>f<span class="sy0">|</span> <span class="kw4">File</span>.<span class="me1">basename</span><span class="br0">&#40;</span>f<span class="br0">&#41;</span> <span class="br0">&#125;</span>
s.<span class="me1">require_paths</span> = <span class="br0">&#91;</span><span class="st0">&quot;lib&quot;</span><span class="br0">&#93;</span>
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse"># -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "hello_world/version"

Gem::Specification.new do |s|
s.name = "hello_world"
s.version = HelloWorld::VERSION
s.platform = Gem::Platform::RUBY
s.authors = ["Seu nome"]
s.email = ["Seu email"]
s.homepage = "Seu Website"
s.summary = %q{Um resumo.}
s.description = %q{A descrição da sua gem}

s.rubyforge_project = "hello_world"

s.files = `git ls-files`.split("\n")
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
s.require_paths = ["lib"]
end</pre>
</div>
</div>
<p><em>* Utilizaremos as configurações logo adiante na hora que formos publicar nossas gem.</em></p>
<p><strong>Versionamento.</strong></p>
<p>Observe que o Bundler criou um /version além de uma constante chamada HelloWorld::VERSION &#8211; gerada pelo <strong>version.rb</strong> dentro de lib/hello_world &#8211; para a nossa gem, isto significa que você pode versionar sua gem através dele. Inclusive, esse é um dos bons recursos adquiridos ao tomar uma decisão de criar uma gem . O ideal é você seguir algumas recomendações <a href="http://semver.org/">Semantic Versioning</a>, mas caso deseje uma mais simples, seguiremos com algumas considerações que fiz:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="co1"># dir: /lib/hello_world/version.rb</span>
&nbsp;
<span class="kw1">module</span> HelloWorld
&nbsp;
VERSION = <span class="st0">&quot;0.0.1&quot;</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse"># dir: /lib/hello_world/version.rb

module HelloWorld

VERSION = "0.0.1"

end</pre>
</div>
</div>
<p>Quando sua gem tiver outros ou novos recursos, é só modificar o número da versão e publicar novamente com o <strong>gem build.</strong></p>
<p>Agora vejamos o que foi gerado no diretório lib/, temos um arquivo chamado <em>hello_world</em>  que é o cara que chamamos quando alguém requerer nossa gem. Você pode criar outros arquivos no diretório e chamá-los nessa classe, mas no nosso caso vai ser só o método hello, para demonstração <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="co1"># dir: lib/hello_world.rb</span>
&nbsp;
<span class="kw1">module</span> HelloWorl
&nbsp;
<span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">hello</span>
&nbsp;
<span class="st0">&quot;Olá mundo!&quot;</span>
&nbsp;
<span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse"># dir: lib/hello_world.rb

module HelloWorl

def self.hello

"Olá mundo!"

end

end</pre>
</div>
</div>
<p><strong>Publicando nossa gem.</strong></p>
<p>Bem, agora que você já gerou a estrutura, criou seu arquivo ruby e definiu algum comportamento ( método), vamos então vamos editar nosso gemspec para publicar nossa gem:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="co1"># -*- encoding: utf-8 -*-</span>
$:.<span class="me1">push</span> <span class="kw4">File</span>.<span class="me1">expand_path</span><span class="br0">&#40;</span><span class="st0">&quot;../lib&quot;</span>, <span class="kw2">__FILE__</span><span class="br0">&#41;</span>
<span class="kw3">require</span> <span class="st0">&quot;hello_world/version&quot;</span>
&nbsp;
<span class="re2">Gem::Specification</span>.<span class="me1">new</span> <span class="kw1">do</span> <span class="sy0">|</span>s<span class="sy0">|</span>
s.<span class="me1">name</span> = <span class="st0">&quot;hello_world&quot;</span>
s.<span class="me1">version</span> = <span class="re2">HelloWorld::VERSION</span>
s.<span class="me1">platform</span> = <span class="re2">Gem::Platform::RUBY</span>
s.<span class="me1">authors</span> = <span class="br0">&#91;</span><span class="st0">&quot;Uriel Juliatti&quot;</span><span class="br0">&#93;</span>
s.<span class="me1">email</span> = <span class="br0">&#91;</span><span class="st0">&quot;uriel.juliatti@giran.com.br&quot;</span><span class="br0">&#93;</span>
s.<span class="me1">homepage</span> = <span class="st0">&quot;&quot;</span>
s.<span class="me1">summary</span> = <span class="sy0">%</span>q<span class="br0">&#123;</span>Primeira gemzinha para aprender como criar a sua própria gem.<span class="br0">&#125;</span>
s.<span class="me1">description</span> = <span class="sy0">%</span>q<span class="br0">&#123;</span>Essa gem é um demonstrativo <span class="kw1">do</span> blog <span class="kw1">do</span> Uriel Juliatti, desenvolvedor web na Giran Soluções e E<span class="sy0">-</span>commerce.<span class="br0">&#125;</span>
&nbsp;
s.<span class="me1">rubyforge_project</span> = <span class="st0">&quot;hello_world&quot;</span>
&nbsp;
s.<span class="me1">files</span> = <span class="st0">`git ls-files`</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>
s.<span class="me1">test_files</span> = <span class="st0">`git ls-files -- {test,spec,features}/*`</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>
s.<span class="me1">executables</span> = <span class="st0">`git ls-files -- bin/*`</span>.<span class="kw3">split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>.<span class="me1">map</span><span class="br0">&#123;</span> <span class="sy0">|</span>f<span class="sy0">|</span> <span class="kw4">File</span>.<span class="me1">basename</span><span class="br0">&#40;</span>f<span class="br0">&#41;</span> <span class="br0">&#125;</span>
s.<span class="me1">require_paths</span> = <span class="br0">&#91;</span><span class="st0">&quot;lib&quot;</span><span class="br0">&#93;</span>
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse"># -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "hello_world/version"

Gem::Specification.new do |s|
s.name = "hello_world"
s.version = HelloWorld::VERSION
s.platform = Gem::Platform::RUBY
s.authors = ["Uriel Juliatti"]
s.email = ["uriel.juliatti@giran.com.br"]
s.homepage = ""
s.summary = %q{Primeira gemzinha para aprender como criar a sua própria gem.}
s.description = %q{Essa gem é um demonstrativo do blog do Uriel Juliatti, desenvolvedor web na Giran Soluções e E-commerce.}

s.rubyforge_project = "hello_world"

s.files = `git ls-files`.split("\n")
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
s.require_paths = ["lib"]
end</pre>
</div>
</div>
<p>Agora buildamos a nossa gem:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
</pre>
</td>
<td class="de1">
<pre class="de1">$ gem build hello_world.<span class="me1">gemspec</span>
WARNING: no homepage specified
Successfully built RubyGem
Name: hello_world
Version: 0.0.1
<span class="kw4">File</span>: hello_world<span class="sy0">-</span>0.0.1.<span class="me1">gem</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">$ gem build hello_world.gemspec
WARNING: no homepage specified
Successfully built RubyGem
Name: hello_world
Version: 0.0.1
File: hello_world-0.0.1.gem</pre>
</div>
</div>
<p>Esse comando é responsável por gerar um <strong>.gem</strong>. Inclusive, otimi a homepage, caso contrário ele iria subir o arquivo para o repositório Rubygems.org e deixaria disponível ao público essa gem teste.</p>
<p><strong>Gemfile</strong></p>
<div id=":1nh">
<div>
<div>
<p>Um detalhe para  o arquivo de Gemspec &#8211; como já mostrado anteriormente &#8211;  é que podemos carregar dependências através do bundler &#8211; sem se preocupar em gerenciar esse arquivo diretamente. É a melhor forma para gerenciar dependências de uma gem. Por exemplo, digamos que escolhêssemos usar o <em>RSpec</em> para testar a nossa gem: Ao invés de referenciar o <em>RSpec</em> diretamente no Gemfile vamos adicioná-lo como uma dependência em <em>hello_word.gemspec</em>.</p>
<p><strong>Obs:</strong> Se você não estiver familiarizado com o gerenciamento de um arquivo Gemspec dê uma conferida na <a href="http://docs.rubygems.org/read/chapter/20#dependencies">documentação</a>.</p>
</div>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="co1"># -*- encoding: utf-8 -*-</span>
$:.<span class="me1">push</span> <span class="kw4">File</span>.<span class="me1">expand_path</span><span class="br0">&#40;</span><span class="st0">&quot;../lib&quot;</span>, <span class="kw2">__FILE__</span><span class="br0">&#41;</span>
<span class="kw3">require</span> <span class="st0">&quot;hello_world/version&quot;</span>
&nbsp;
<span class="re2">Gem::Specification</span>.<span class="me1">new</span> <span class="kw1">do</span> <span class="sy0">|</span>s<span class="sy0">|</span>
s.<span class="me1">add_development_dependency</span> <span class="st0">&quot;rspec&quot;</span>
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse"># -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "hello_world/version"

Gem::Specification.new do |s|
s.add_development_dependency "rspec"
end</pre>
</div>
</div>
<p>Só para garantir, já que o arquivo é referenciado através do Gemfile , vamos executar o bundle e averiguar se temos todas as dependências instaladas:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
</pre>
</td>
<td class="de1">
<pre class="de1">&nbsp;$ bundle
Fetching source index <span class="kw1">for</span> http:<span class="sy0">//</span>rubygems.<span class="me1">org</span><span class="sy0">/</span>
Using diff<span class="sy0">-</span>lcs <span class="br0">&#40;</span>1.1.2<span class="br0">&#41;</span>
Using hello_world <span class="br0">&#40;</span>0.0.1<span class="br0">&#41;</span> from source at <span class="sy0">/</span>Users<span class="sy0">/</span>urieljuliatti<span class="sy0">/</span>Projects<span class="sy0">/</span>ruby<span class="sy0">/</span>hello_world
Installing rspec<span class="sy0">-</span>core <span class="br0">&#40;</span>2.3.1<span class="br0">&#41;</span>
Installing rspec<span class="sy0">-</span>expectations <span class="br0">&#40;</span>2.3.0<span class="br0">&#41;</span>
Installing rspec<span class="sy0">-</span>mocks <span class="br0">&#40;</span>2.3.0<span class="br0">&#41;</span>
Installing rspec <span class="br0">&#40;</span>2.3.0<span class="br0">&#41;</span>
Using bundler <span class="br0">&#40;</span>1.0.7<span class="br0">&#41;</span>
Your bundle is complete! It was installed into <span class="sy0">/</span>Users<span class="sy0">/</span>urieljuliatti<span class="sy0">/</span>.<span class="me1">rvm</span><span class="sy0">/</span>gems<span class="sy0">/</span>ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse"> $ bundle
Fetching source index for http://rubygems.org/
Using diff-lcs (1.1.2)
Using hello_world (0.0.1) from source at /Users/urieljuliatti/Projects/ruby/hello_world
Installing rspec-core (2.3.1)
Installing rspec-expectations (2.3.0)
Installing rspec-mocks (2.3.0)
Installing rspec (2.3.0)
Using bundler (1.0.7)
Your bundle is complete! It was installed into /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p290</pre>
</div>
</div>
<p>Dessa forma, ao publicarmos uma gem que tenha vários contribuidores envolvidos, você pode instruí-los a usar o bundle, ajudando-os a configurar o ambiente e instalando todas as suas dependências de uma só vez. Como boa prática, adicione essas informações sempre no README da sua gem <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Gerenciando tarefas.</strong></p>
<p>Um outro bom detalhe é se atentar ao Rakefile gerado pelo Bundler e as suas tarefas:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="co1">#dir /Rakefile</span>
&nbsp;
<span class="kw3">require</span> <span class="st0">'bundler'</span>
&nbsp;
$ rake <span class="sy0">-</span>T
&nbsp;
<span class="br0">&#40;</span><span class="kw1">in</span> <span class="sy0">/</span>Users<span class="sy0">/</span>urieljuliatti<span class="sy0">/</span>ruby<span class="sy0">/</span>hello_world<span class="br0">&#41;</span>
&nbsp;
rake build    <span class="co1"># Constrói a gem  dentro de um diretório , empacotando-a.</span>
&nbsp;
rake install  <span class="co1"># Constrói e instala a gem no sistema de gems</span>
&nbsp;
rake release  <span class="co1"># Cria uma tag para a versão, constrói a gem e publica lá em Rubygems</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">#dir /Rakefile

require 'bundler'

$ rake -T

(in /Users/urieljuliatti/ruby/hello_world)

rake build    # Constrói a gem  dentro de um diretório , empacotando-a.

rake install  # Constrói e instala a gem no sistema de gems

rake release  # Cria uma tag para a versão, constrói a gem e publica lá em Rubygems</pre>
</div>
</div>
<p>Esse código é responsável por instalar uma gem e configurada do nosso jeito, portanto podemos instalá-la e testá-la por completo localmente, aí então chamar o rake release para tagear aquela versão e publicá-la no RubyGems. Praticamente, é uma forma de &#8220;automatizar&#8221; certos processos referentes a produção das nossas gems.</p>
</div>
</div>
<!-- AddThis Button BEGIN --> 
<div class="addthis_toolbox addthis_default_style addthis_32x32_style"> 
<a class="addthis_button_compact"></a> 
<a class="addthis_button_googlebuzz"></a> 
<a class="addthis_button_twitter"></a> 
<a class="addthis_button_facebook"></a> 
<a class="addthis_button_linkedin"></a> 
<a class="addthis_button_stumbleupon"></a> 
<a class="addthis_button_digg"></a> 
<a class="addthis_button_misterwong"></a> 
<a class="addthis_button_multiply"></a> 
<a class="addthis_button_hellotxt"></a> 
<a class="addthis_button_bitly"></a> 
<a class="addthis_button_googletranslate"></a> 
<a class="addthis_button_myspace"></a> 
<a class="addthis_button_bebo"></a> 
<a class="addthis_button_amazonwishlist"></a> 
<a class="addthis_button_baidu"></a> 
<a class="addthis_button_blinklist"></a> 
<a class="addthis_button_blip"></a> 
<a class="addthis_button_blogger"></a> 
<a class="addthis_button_faves"></a> 
<a class="addthis_button_formspring"></a> 
<a class="addthis_button_googlereader"></a> 
<a class="addthis_button_hackernews"></a> 
<a class="addthis_button_hotmail"></a> 
<a class="addthis_button_instapaper"></a> 
<a class="addthis_button_myaol"></a> 
<a class="addthis_button_netvibes"></a> 
<a title="Send to CMSVoteUp" href="http://cmsvoteup.com/index.php?page=submit1&url="><img border="0" src="http://cmsvoteup.com/images/cmsvoteup-icon-32x32-2.png"></a> 
<a title="Send to DontClickOn" href="http://dontclickon.com/index.php?page=submit1&url="><img border="0" src="http://dontclickon.com/images/dco-icon-32x32.png"></a> 
</div> 
<script type="text/javascript">var addthis_config = {"data_track_clickback":};</script> 
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid="></script> ]]></content:encoded>
			<wfw:commentRss>http://urieljuliatti.com/2012/01/criando-suas-proprias-gems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classes e Módulos &#8211; Visibilidade: Public, Protected e Private.</title>
		<link>http://urieljuliatti.com/2011/11/classes-e-modulos-visibilidade-public-protected-e-private/</link>
		<comments>http://urieljuliatti.com/2011/11/classes-e-modulos-visibilidade-public-protected-e-private/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 11:21:25 +0000</pubDate>
		<dc:creator>Uriel Juliatti Valle</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[Rails 3]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[programming ruby]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails 3 way]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby1.9]]></category>
		<category><![CDATA[rubyconfbr]]></category>

		<guid isPermaLink="false">http://urieljuliatti.com/?p=631</guid>
		<description><![CDATA[Métodos de instância podem ser public, private ou protected. Se você veio de outras linguagens de programação orientadas a objeto, provavelmente já está familiarizado com esses termos e com o forte e importante conceito de encapsulação. Mesmo com esse background, não subestime, pois no Ruby alguns desses termos podem ter um significado um pouco diferente. [...]]]></description>
			<content:encoded><![CDATA[<p>Métodos de instância podem ser <em>public</em>, <em>private</em> ou <em>protected</em>. Se você veio de outras linguagens de programação orientadas a objeto, provavelmente já está familiarizado com esses termos e com o forte e importante conceito de <strong><em>encapsulação</em></strong>. Mesmo com esse background, não subestime, pois no Ruby alguns desses termos podem ter um significado um pouco diferente.</p>
<p><strong>Public</strong></p>
<p>Geralmente  - <em>e por padrão</em> &#8211;  os métodos em ruby são públicos, ao menos que você especifique a visibilidade. Além disso, podem ser chamados de qualquer lugar, pois não há restrição quanto ao seu uso. Mas há uma exceção em cena &#8211; o <em>initialize &#8211; </em>que é por natureza <em>private</em>. Outras exceções, tais como qualquer método declarado fora da definição da classe &#8211; <em>e que podem ser considerados &#8220;globais&#8221; -</em> também são definidos como private e são métodos específicos de <em>Object</em>.</p>
<p><strong>Private</strong></p>
<p>Um método privado é específico para uma implementação de uma classe e só pode ser chamado por outros métodos de instância de uma classe ou subclasses. Entretanto, métodos privados são implicitamente chamados com <strong><em>self</em></strong> e não podem ser explicitamente chamados em um objeto. Por exemplo, se um método <em>m</em> é private você só pode chamá-lo de forma funcional, como m. É impossível chamar como <em>o.m</em> ou <em>self.m.</em></p>
<p><strong>Protected</strong></p>
<p>Um método <em>protected</em> é como um método <em>private</em> que só pode ser chamado dentro da implementação da classe ou suas subclasses. A diferença de um método private é que ele pode ser chamado em qualquer instância da classe e não é restrito à chamada implícita do <strong><em>self</em></strong>. Um método protected pode ser usado, por exemplo, em uma situação em que você define um acessor que permita compartilhar os estados dos objetos uns com os outros, mas não permite que os usuários daquela classe tenham acesso aos estados.</p>
<p><strong>Além disso&#8230;</strong></p>
<p>P<em>rivate</em>, <em>protected</em> e <em>public</em> são métodos de instância da classe <strong><em>Module</em></strong>. Em ruby, todas as classes são módulos e dentro da definição da classe, mas fora da definição dos métodos, <strong>self</strong> refere-se sempre à classe que está sendo definida em questão.</p>
<blockquote><p>Boas práticas:</p>
<p><span style="font-size: 15px; color: #000000; font-weight: normal;">Ao declarar métodos private e protected procure alinhá-los ao final da classe</span></p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> <span class="kw4">Test</span>
&nbsp;
<span class="kw1">def</span> initialize<span class="br0">&#40;</span>x, y<span class="br0">&#41;</span>
<span class="re1">@x</span>, <span class="re1">@y</span> = x, y
<span class="kw1">end</span>
&nbsp;
private
<span class="kw1">def</span> backgroud_proc
<span class="kw2">nil</span>
<span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Test

def initialize(x, y)
@x, @y = x, y
end

private
def backgroud_proc
nil
end

end</pre>
</div>
</div>
<p><span style="font-size: 15px; color: #000000; font-weight: normal;">Uma outra é que você pode declarar a visibilidade do método sempre após a sua definição, assim:</span></p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> Foo
&nbsp;
<span class="kw1">def</span> x
<span class="re1">@x</span>
<span class="kw1">end</span>
protected : x
&nbsp;
<span class="kw1">def</span> utility_method
<span class="kw2">nil</span>
<span class="kw1">end</span>
private <span class="re3">:utility_method</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Foo

def x
@x
end
protected : x

def utility_method
nil
end
private :utility_method

end</pre>
</div>
</div>
<p>&nbsp;</p></blockquote>
<p>Um outro detalhe importante, <del>mas muito importante </del> é que a visibilidade public, private e protected aplicam-se apenas aos <strong>métodos</strong> em Ruby. Variáveis de classe e instância são sempre encapsuladas e definidas como private por padrão, as constantes são sempre públicas &#8211; <em>violar essas regras podem custar erros no interpretador.</em> Por fim, não tente definir uma variável como public e acessá-la diretamente, pois como dito, não terá êxito.Uma das formas de fazer esse &#8220;acesso direto&#8221; é por intermédio dos accessors (attrs) que o ruby oferece &#8211; e que facilita muito a nossa vida como desenvolvedor.</p>
<p>Alguns casos são interessantes para se analisar, por exemplo, caso você venha a executar uma fabricação de um objeto (Factory Method) em sua classe, pode vir a necessidade de tornar o método de classe <strong>new</strong> privado. Para tornar isso possível, utilize o método <strong>private_class_method </strong>especificando um ou mais nome de métodos &#8211; <em><strong>new</strong> no nosso caso</em> &#8211; como símbolo.</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1">private_class_method <span class="re3">:new</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">private_class_method :new</pre>
</div>
</div>
<p>Da mesma forma que você o torna private, você pode torná-lo público com o método <strong>public_class_method </strong>:new.</p>
<p><strong>Obs</strong>: Nenhum método pode ser chamado sem argumentos da mesma forma que o public, protected e private são.</p>
<p>Levando em consideração a flexibilidade da linguagem ruby, suas robustez &#8211; <em>que pouco conheço</em> &#8211; é importante conhecer  e entender, no entanto, que as capacidades de <strong>metaprogramação</strong> do Ruby também torna confortável chamar métodos privados e protegidos e até mesmo acessar variáveis ​​de instância encapsuladas.</p>
<p>Dessa forma, se quiséssemos acessar o método privado <em>utility_method</em> declarado anteriormente, poderíamos utilizar o método <em>send</em>, ou até mesmo o método <em>instance_eval</em> para avaliar um bloco no contexto do objeto corrente:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :032 <span class="sy0">&gt;</span> f = Foo.<span class="me1">new</span>
<span class="sy0">=&gt;</span> <span class="co1">#&lt;Foo:0x007fba4969d1a0&gt;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :033 <span class="sy0">&gt;</span> f.<span class="me1">send</span> <span class="re3">:utility_method</span> <span class="co1"># chamando um método privado!</span>
<span class="sy0">=&gt;</span> <span class="kw2">nil</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :034 <span class="sy0">&gt;</span> f.<span class="me1">instance_eval</span> <span class="br0">&#123;</span> utility_method <span class="br0">&#125;</span> <span class="co1"># chamando novamente um método privado!</span>
<span class="sy0">=&gt;</span> <span class="kw2">nil</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :035 <span class="sy0">&gt;</span> f.<span class="me1">instance_eval</span> <span class="br0">&#123;</span> <span class="re1">@x</span> <span class="br0">&#125;</span> <span class="co1"># lendo uma variável de instância de f</span>
<span class="sy0">=&gt;</span> <span class="kw2">nil</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p290 :032 &gt; f = Foo.new
=&gt; #&lt;Foo:0x007fba4969d1a0&gt;
ruby-1.9.2-p290 :033 &gt; f.send :utility_method # chamando um método privado!
=&gt; nil
ruby-1.9.2-p290 :034 &gt; f.instance_eval { utility_method } # chamando novamente um método privado!
=&gt; nil
ruby-1.9.2-p290 :035 &gt; f.instance_eval { @x } # lendo uma variável de instância de f
=&gt; nil</pre>
</div>
</div>
<p>Lindo, não?!</p>
<p>Ainda farei uma cobertura mais abrangente sobre o <strong>send</strong> e <strong>instance_eval </strong>quando abordarmos a metaprogramação de uma forma mais investigativa <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Então é isso, fechamos mais um episódio com métodos de acesso e acessibilidade no Ruby, o próximo passo será investigar sobre <strong><em>Herança e Subclasses</em></strong>.</p>
<p>Até a próxima!</p>
<!-- AddThis Button BEGIN --> 
<div class="addthis_toolbox addthis_default_style addthis_32x32_style"> 
<a class="addthis_button_compact"></a> 
<a class="addthis_button_googlebuzz"></a> 
<a class="addthis_button_twitter"></a> 
<a class="addthis_button_facebook"></a> 
<a class="addthis_button_linkedin"></a> 
<a class="addthis_button_stumbleupon"></a> 
<a class="addthis_button_digg"></a> 
<a class="addthis_button_misterwong"></a> 
<a class="addthis_button_multiply"></a> 
<a class="addthis_button_hellotxt"></a> 
<a class="addthis_button_bitly"></a> 
<a class="addthis_button_googletranslate"></a> 
<a class="addthis_button_myspace"></a> 
<a class="addthis_button_bebo"></a> 
<a class="addthis_button_amazonwishlist"></a> 
<a class="addthis_button_baidu"></a> 
<a class="addthis_button_blinklist"></a> 
<a class="addthis_button_blip"></a> 
<a class="addthis_button_blogger"></a> 
<a class="addthis_button_faves"></a> 
<a class="addthis_button_formspring"></a> 
<a class="addthis_button_googlereader"></a> 
<a class="addthis_button_hackernews"></a> 
<a class="addthis_button_hotmail"></a> 
<a class="addthis_button_instapaper"></a> 
<a class="addthis_button_myaol"></a> 
<a class="addthis_button_netvibes"></a> 
<a title="Send to CMSVoteUp" href="http://cmsvoteup.com/index.php?page=submit1&url="><img border="0" src="http://cmsvoteup.com/images/cmsvoteup-icon-32x32-2.png"></a> 
<a title="Send to DontClickOn" href="http://dontclickon.com/index.php?page=submit1&url="><img border="0" src="http://dontclickon.com/images/dco-icon-32x32.png"></a> 
</div> 
<script type="text/javascript">var addthis_config = {"data_track_clickback":};</script> 
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid="></script> ]]></content:encoded>
			<wfw:commentRss>http://urieljuliatti.com/2011/11/classes-e-modulos-visibilidade-public-protected-e-private/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Classes e Módulos &#8211; Variáveis de Classe e Variáveis de Instância de Classe.</title>
		<link>http://urieljuliatti.com/2011/10/classes-e-modulos-variaveis-de-classe-e-variaveis-de-instancia-de-classe/</link>
		<comments>http://urieljuliatti.com/2011/10/classes-e-modulos-variaveis-de-classe-e-variaveis-de-instancia-de-classe/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 12:05:09 +0000</pubDate>
		<dc:creator>urieljuliatti</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[Rails 3]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[class variables]]></category>
		<category><![CDATA[instance variables]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby2011]]></category>
		<category><![CDATA[rubyconf]]></category>
		<category><![CDATA[rubyconfbrasil]]></category>

		<guid isPermaLink="false">http://urieljuliatti.wordpress.com/?p=621</guid>
		<description><![CDATA[Estamos aí de novo para retomar nossos estudos de ruby. Hoje falarei sobre Variáveis de Classe e Variáveis de Instância. Mas.. Antes de mais nada: Poderia ter deixado para o final, mas vale lembrar que semana que vem acontecerá a RubyConf Brasil, que ocorrerá dia 3 e 4 de novembro em São Paulo. Nem é uma [...]]]></description>
			<content:encoded><![CDATA[<p>Estamos aí de novo para retomar nossos estudos de ruby. Hoje falarei sobre Variáveis de Classe e Variáveis de Instância. Mas..</p>
<p><strong>Antes de mais nada:</strong></p>
<p style="text-align:center;"><img class="aligncenter" title="RubyConf2011" src="http://rubyconf2011.akitaonrails.com/images/LogoRubyConf.jpg" alt="" width="335" height="107" /></p>
<p>Poderia ter deixado para o final, mas vale lembrar que semana que vem acontecerá a <strong>RubyConf Brasil</strong>, que ocorrerá dia 3 e 4 de novembro em São Paulo. Nem é uma questão de puro <em>merchanda</em>, mas vale a pena mesmo comparecer em um evento tão importante como esse. Além de encontrar profissionais da área e palestras de qualidade (feitas também por profissionais da área), tem toda a questão de fortalecer e acompanhar o crescimento da linguagem no Brasil. Veja o <strong><em>cast</em></strong> <a href="http://rubyconf2011.akitaonrails.com/br/speakers.html">http://rubyconf2011.akitaonrails.com/br/speakers.html</a> e me diga se você não se assustou com tamanha qualidade. (Detalhe pra quem curte: Se liga na camisa do Nick Sutterer hehehe).</p>
<p>Pois é, muita coisa boa. As inscrições encerraram, mas vale a dica para o RubyConf do ano que vem. Provavelmente trarei um post aqui com a cobertura parcial do evento.</p>
<p><em>Link do evento:</em> <a href="http://rubyconf2011.akitaonrails.com/">http://rubyconf2011.akitaonrails.com/</a></p>
<p><strong>Rollback.</strong></p>
<p>Bem, agora vamos voltar com o ruby e falar um pouco sobre <em>Variáveis de Classe</em>.</p>
<p>O que são <strong>Variáveis de Classe</strong>?</p>
<p>Elas são visíveis e compartilhadas para os métodos de classe e os métodos de instância de uma classe e até mesmo pela definição da própria classe, em suma, com ela é possível que todos os objetos a compartilhem. Se você lembrar da programação tradicional, ela funciona como se fosse uma variável global. Assim como as variáveis de instância, as variáveis de classe são <em>encapsuladas</em>; podem ser usadas na implementação de uma classe, porém não permitem acesso direto. Em ruby, elas possuem a sintaxe marcada pelo <em><strong>@@</strong>.</em></p>
<p>Uma maneira elegante de mostrar a sua utilização seria em um caso onde contabilizaríamos o número de objetos de uma classe que foram criados, por exemplo.</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> <span class="kw4">Test</span>
&nbsp;
&nbsp; &nbsp;@@n = <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> initialize
&nbsp; &nbsp; &nbsp; &nbsp;@@n <span class="sy0">+</span>= <span class="nu0">1</span>
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">report</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">puts</span> <span class="st0">&quot;Number of objects created: #@@n&quot;</span>
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Test

   @@n = 0

   def initialize
       @@n += 1
   end

   def self.report
       puts "Number of objects created: #@@n"
   end

end</pre>
</div>
</div>
<p>Com o método de classe <em><strong>report, </strong></em>conseguimos obter um retorno com o número de objetos já criados:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :018 <span class="sy0">&gt;</span> t = <span class="kw4">Test</span>.<span class="me1">new</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :019 <span class="sy0">&gt;</span> <span class="kw4">Test</span>.<span class="me1">report</span>
Number of objects created: <span class="nu0">1</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">nil</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :020 <span class="sy0">&gt;</span> <span class="kw4">Test</span>.<span class="me1">report</span>
Number of objects created: <span class="nu0">1</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">nil</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :022 <span class="sy0">&gt;</span> t = <span class="kw4">Test</span>.<span class="me1">new</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :023 <span class="sy0">&gt;</span> <span class="kw4">Test</span>.<span class="me1">report</span>
Number of objects created: <span class="nu0">2</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">nil</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :018 &gt; t = Test.new
 =&gt; #

ruby-1.9.2-p136 :019 &gt; Test.report
Number of objects created: 1
 =&gt; nil

ruby-1.9.2-p136 :020 &gt; Test.report
Number of objects created: 1
 =&gt; nil

ruby-1.9.2-p136 :022 &gt; t = Test.new
 =&gt; #

ruby-1.9.2-p136 :023 &gt; Test.report
Number of objects created: 2
 =&gt; nil</pre>
</div>
</div>
<p><strong>Variáveis de Instância de uma Classe</strong><strong><br />
</strong><br />
Classes são objetos e podem ter variáveis de instância assim como os objetos podem ter. As variáveis de instância de uma classe &#8211; as vezes chamadas apenas de variáveis de instância de classe - não são a mesma coisa que variáveis de instância. Mas elas são parecidas o suficiente epodem também ser usadas ao invés das variáveis de classe.</p>
<p>Uma variável de classe utilizada dentro de uma definição de classe e fora de um método de instância é uma variável de instância de uma classe.  Assim como variáveis ​​de classe, variáveis ​​de instância de classe são associadas com a classe do que com qualquer instância específica da classe.</p>
<p>A desvantagem de usá-las é que elas não podem ser usadas dentro de métodos de instância como as variáveis de classe usam. Além dessa desvantagem, existe uma considerável possibilidade de confundir as variáveis de instância de classe com as variáveis de instância simples.</p>
<p><strong>Para ficar bem claro:</strong> As variáveis de instância são criadas quando você instancia a Classe e as variáveis de instância de classe são injetadas em tempo de execução, partindo do princípio de que o objeto já foi instanciado.</p>
<p>Da mesma forma que as variáveis de instância, podemos utilizar <strong>attr</strong>, <strong>attr_reader</strong> e <strong>attr_accessor </strong>para criar métodos de acesso para elas. A única coisa que deve ser levada em consideração é que, para chamar esses métodos utilizados em <em>metaprogramação </em>no contexto certo<em>.</em></p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> <span class="sy0">&lt;&lt;</span> <span class="kw2">self</span>
&nbsp; &nbsp; &nbsp; attr_accessor : n, : x, : y
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class &lt;&lt; self
      attr_accessor : n, : x, : y
end</pre>
</div>
</div>
<p>Com esses acessores definidos, podemos fazer referências aos dados utilizados em Ponto.x, Ponto.y, Ponto.n <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Então rapazeada, ficamos nessa por aqui. Vou rumo a RubyConf que com certeza trará muito esclarecimento,<br />
conhecimento e novas experiências.</p>
<p>Abraços!</p>
<p><em>Referências Externas:</em></p>
<p>http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/</p>
<p>http://sporkmonger.com/2007/2/19/instance-variables-class-variables-and-inheritance-in-ruby</p>
<p>http://www.oreillynet.com/ruby/blog/2007/01/nubygems_dont_use_class_variab_1.html</p>
<!-- AddThis Button BEGIN --> 
<div class="addthis_toolbox addthis_default_style addthis_32x32_style"> 
<a class="addthis_button_compact"></a> 
<a class="addthis_button_googlebuzz"></a> 
<a class="addthis_button_twitter"></a> 
<a class="addthis_button_facebook"></a> 
<a class="addthis_button_linkedin"></a> 
<a class="addthis_button_stumbleupon"></a> 
<a class="addthis_button_digg"></a> 
<a class="addthis_button_misterwong"></a> 
<a class="addthis_button_multiply"></a> 
<a class="addthis_button_hellotxt"></a> 
<a class="addthis_button_bitly"></a> 
<a class="addthis_button_googletranslate"></a> 
<a class="addthis_button_myspace"></a> 
<a class="addthis_button_bebo"></a> 
<a class="addthis_button_amazonwishlist"></a> 
<a class="addthis_button_baidu"></a> 
<a class="addthis_button_blinklist"></a> 
<a class="addthis_button_blip"></a> 
<a class="addthis_button_blogger"></a> 
<a class="addthis_button_faves"></a> 
<a class="addthis_button_formspring"></a> 
<a class="addthis_button_googlereader"></a> 
<a class="addthis_button_hackernews"></a> 
<a class="addthis_button_hotmail"></a> 
<a class="addthis_button_instapaper"></a> 
<a class="addthis_button_myaol"></a> 
<a class="addthis_button_netvibes"></a> 
<a title="Send to CMSVoteUp" href="http://cmsvoteup.com/index.php?page=submit1&url="><img border="0" src="http://cmsvoteup.com/images/cmsvoteup-icon-32x32-2.png"></a> 
<a title="Send to DontClickOn" href="http://dontclickon.com/index.php?page=submit1&url="><img border="0" src="http://dontclickon.com/images/dco-icon-32x32.png"></a> 
</div> 
<script type="text/javascript">var addthis_config = {"data_track_clickback":};</script> 
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid="></script> ]]></content:encoded>
			<wfw:commentRss>http://urieljuliatti.com/2011/10/classes-e-modulos-variaveis-de-classe-e-variaveis-de-instancia-de-classe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Quick Post] &#8211; Construindo suas próprias tarefas com o Rake</title>
		<link>http://urieljuliatti.com/2011/10/quick-post-construindo-suas-proprias-tarefas-com-o-rake/</link>
		<comments>http://urieljuliatti.com/2011/10/quick-post-construindo-suas-proprias-tarefas-com-o-rake/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 10:37:26 +0000</pubDate>
		<dc:creator>urieljuliatti</dc:creator>
				<category><![CDATA[Rails 3]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[rake rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://urieljuliatti.wordpress.com/?p=612</guid>
		<description><![CDATA[Muitos utilizam o rake sem ao menos saber o que ele é. Você mesmo já deve estar acostumado a rodar o comando rake db:migrate , certo? Bem, o objetivo desse post não é explicar em detalhes o que é o rake, mas sim em como customizá-lo. Portanto, de forma resumida, ele é nada mais do que uma [...]]]></description>
			<content:encoded><![CDATA[<p>Muitos utilizam o rake sem ao menos saber o que ele é. Você mesmo já deve estar acostumado a rodar o comando <strong><em><span class="Apple-style-span" style="font-family:Consolas, Monaco, monospace;font-size:12px;line-height:18px;white-space:pre;">rake db:migrate </span></em></strong>, certo?</p>
<p>Bem, o objetivo desse post não é explicar em detalhes o que é o rake, mas sim em como customizá-lo. Portanto, de forma resumida, ele é nada mais do que uma gem que quando instalada utiliza-se do executável &#8216;rake&#8217; para demandar suas <strong>tarefas</strong>. A idéia é de que funcionasse como o &#8216;make&#8217; do Unix, ou seja, um <strong>R</strong>uby M<strong>ake</strong>, se assim posso dizer hehe. Contudo, entre piadinhas ruins a parte, o rake é responsável por executar tarefas em sua aplicação.</p>
<p>O rails precisa que você executa o rake a partir da raiz do projeto para que ele acesse o seu RakeFile. Só por uma questão de investigação, abra o seu RakeFile:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw3">require</span> <span class="kw4">File</span>.<span class="me1">expand_path</span><span class="br0">&#40;</span><span class="st0">'../config/application'</span>, <span class="kw2">__FILE__</span><span class="br0">&#41;</span>
<span class="kw3">require</span> <span class="st0">'rake'</span>
&nbsp;
<span class="re2">Project::Application</span>.<span class="me1">load_tasks</span><span class="sy0">&lt;/</span>pre<span class="sy0">&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">require File.expand_path('../config/application', __FILE__)
require 'rake'

Project::Application.load_tasks&lt;/pre&gt;</pre>
</div>
</div>
<p>A partir daí, ele prepara o &#8216;ambiente&#8217; para todas as tarefas que existirem, customizadas ou não.</p>
<p><strong>Customizando.</strong></p>
<p>O acesso que você possui para customizar tarefas é em /lib/tasks. Neste exemplo, vou mostrar como configurar uma tarefa de seed específico para um rake db:seed, veja o resultado:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="co1"># libs/tasks/</span>
namespace <span class="re3">:db</span> <span class="kw1">do</span>
&nbsp; &nbsp;<span class="co1"># poderia ser qualquer outra coisa que seguisse os padrões do :db</span>
&nbsp; &nbsp;namespace <span class="re3">:seed</span> <span class="kw1">do</span>
&nbsp; &nbsp; &nbsp; <span class="co1"># qualquer coisa.</span>
&nbsp; &nbsp; &nbsp; task <span class="re3">:galeria</span> <span class="sy0">=&gt;</span> <span class="re3">:environment</span> <span class="kw1">do</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">#exemplo desabilitando uma galeria</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;galeria = Attribute.<span class="me1">find_by_name</span><span class="br0">&#40;</span><span class="st0">'Galeria'</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">if</span> galeria
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; galeria.<span class="me1">update_attributes</span><span class="br0">&#40;</span><span class="re3">:code</span> <span class="sy0">=&gt;</span> <span class="nu0">1</span>, <span class="re3">:name</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;Galeria&quot;</span>, <span class="re3">:installed</span> <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; galeria.<span class="me1">save</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">end</span>
&nbsp; &nbsp; &nbsp;<span class="kw1">end</span>
&nbsp; <span class="kw1">end</span>
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse"># libs/tasks/
namespace :db do
   # poderia ser qualquer outra coisa que seguisse os padrões do :db
   namespace :seed do
      # qualquer coisa.
      task :galeria =&gt; :environment do
         #exemplo desabilitando uma galeria
         galeria = Attribute.find_by_name('Galeria')
         if galeria
            galeria.update_attributes(:code =&gt; 1, :name =&gt; "Galeria", :installed =&gt; 0)
            galeria.save
         end
     end
  end
end</pre>
</div>
</div>
<p>Ao executar rake db:seed:galeria, vou ter minha galeria desabilitada.</p>
<p>É isso aí e até o próximo!</p>
<p>Referências:</p>
<p>http://databasically.com/2008/08/03/rake-list-tasks/ | Lista com várias tasks para :db</p>
<p>http://www.tutorialspoint.com/ruby-on-rails/rails-and-rake.htm</p>
<p>http://akitaonrails.com/2009/02/16/automatizando-tarefas-com-ruby-e-rake</p>
<!-- AddThis Button BEGIN --> 
<div class="addthis_toolbox addthis_default_style addthis_32x32_style"> 
<a class="addthis_button_compact"></a> 
<a class="addthis_button_googlebuzz"></a> 
<a class="addthis_button_twitter"></a> 
<a class="addthis_button_facebook"></a> 
<a class="addthis_button_linkedin"></a> 
<a class="addthis_button_stumbleupon"></a> 
<a class="addthis_button_digg"></a> 
<a class="addthis_button_misterwong"></a> 
<a class="addthis_button_multiply"></a> 
<a class="addthis_button_hellotxt"></a> 
<a class="addthis_button_bitly"></a> 
<a class="addthis_button_googletranslate"></a> 
<a class="addthis_button_myspace"></a> 
<a class="addthis_button_bebo"></a> 
<a class="addthis_button_amazonwishlist"></a> 
<a class="addthis_button_baidu"></a> 
<a class="addthis_button_blinklist"></a> 
<a class="addthis_button_blip"></a> 
<a class="addthis_button_blogger"></a> 
<a class="addthis_button_faves"></a> 
<a class="addthis_button_formspring"></a> 
<a class="addthis_button_googlereader"></a> 
<a class="addthis_button_hackernews"></a> 
<a class="addthis_button_hotmail"></a> 
<a class="addthis_button_instapaper"></a> 
<a class="addthis_button_myaol"></a> 
<a class="addthis_button_netvibes"></a> 
<a title="Send to CMSVoteUp" href="http://cmsvoteup.com/index.php?page=submit1&url="><img border="0" src="http://cmsvoteup.com/images/cmsvoteup-icon-32x32-2.png"></a> 
<a title="Send to DontClickOn" href="http://dontclickon.com/index.php?page=submit1&url="><img border="0" src="http://dontclickon.com/images/dco-icon-32x32.png"></a> 
</div> 
<script type="text/javascript">var addthis_config = {"data_track_clickback":};</script> 
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid="></script> ]]></content:encoded>
			<wfw:commentRss>http://urieljuliatti.com/2011/10/quick-post-construindo-suas-proprias-tarefas-com-o-rake/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classes e Módulos.</title>
		<link>http://urieljuliatti.com/2011/10/classes-e-modulos/</link>
		<comments>http://urieljuliatti.com/2011/10/classes-e-modulos/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 10:54:10 +0000</pubDate>
		<dc:creator>urieljuliatti</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby1.9.2]]></category>

		<guid isPermaLink="false">http://urieljuliatti.wordpress.com/?p=564</guid>
		<description><![CDATA[Fala rapazeada, tudo na &#8216;sussabilidade&#8217;?! Pois é, vamos aqui seguindo mais um post para contribuir para essa longa e maravilhosa jornada que estou percorrendo com o ruby. Resolvi ir direto para um tema que estou tendo bastante curiosidade no momento, que é sobre Classes e Módulos com ruby, especialmente os módulos. Começarei com as Classes, [...]]]></description>
			<content:encoded><![CDATA[<p>Fala rapazeada, tudo na &#8216;sussabilidade&#8217;?!</p>
<p>Pois é, vamos aqui seguindo mais um post para contribuir para essa longa e <strong>maravilhosa</strong> jornada que estou percorrendo com o ruby.</p>
<p>Resolvi ir direto para um tema que estou tendo bastante curiosidade no momento, que é sobre <em>Classes</em> e <em>Módulos</em> com ruby, especialmente os <em>módulos</em>.</p>
<p>Começarei com as Classes, cuja abordagem é vasta, podendo ser dividida em várias etapas. É bem capaz que eu resuma muita coisa, dando ênfase apenas as partes relevantes, mas sempre deixando algumas referências para acrescentar e talvez divida esse post em séries de posts, para facilitar a divisão dos tópicos.</p>
<p><strong>Antes de tudo.</strong></p>
<p>Como muitos de nós sabemos, Ruby  é uma linguagem puramente Orientada a Objetos, cada valor é (ou ao menos se comporta) como um objeto.<strong></strong> Todo objeto é uma instância de uma classe. E uma classe define uma série de métodos que respondem a um objeto. Por convenção de arquitetura de software, uma classe pode extender ou ser uma subclasse de outras classes e herdar ou sobrescrever métodos de suas superclasses. Em Ruby, as classes também podem ter métodos herdados de <em>módulos</em>.</p>
<p>Os objetos são estritamente encapsulados: Os estados só podem ser acessados por seus métodos já definidos. As variáveis de instância manipuladas por esses métodos não podem ser acessadas diretamente por fora do objeto. É possível gerar <em>getters</em> e <em>setters</em>, acessando diretamente o estado do objeto. Esses acessores são conhecidos como <em>atributos</em> são diferentes das variáveis de instância. A visibilidade dos métodos de uma classe podem ser definidas como &#8220;public&#8221;, &#8220;private&#8221; ou &#8220;protected&#8221; que afetam drásticamente na forma que eles são chamados.</p>
<p>Ao contrário do que se pensa sobre as restrições geradas pelo encapsulamento de um estado do objeto, as classes em Ruby são bastante abertas. Qualquer programa em ruby pode adicionar métodos para classes já existentes e até mesmo métodos singleton para objetos específicos. É um conceito bem interessante, pois ao fazer:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> <span class="kw4">Test</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> user<span class="br0">&#40;</span>nome<span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;nome <span class="sy0">||</span>= <span class="st0">&quot;João Padrão&quot;</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span>
&nbsp;
<span class="co1"># abrindo a mesma classe e editando-a novamente</span>
&nbsp;
<span class="kw1">def</span> <span class="kw4">Test</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">def</span> user<span class="br0">&#40;</span>nome, cpf<span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; nome <span class="sy0">||</span>= <span class="st0">&quot;Pedro Padrão&quot;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; cpf <span class="sy0">||</span>= <span class="st0">&quot;106.778.900-90&quot;</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Test

   def user(nome)

       nome ||= "João Padrão"

   end

end

# abrindo a mesma classe e editando-a novamente

def Test

    def user(nome, cpf)

        nome ||= "Pedro Padrão"

        cpf ||= "106.778.900-90"

    end

end</pre>
</div>
</div>
<p>O que vamos fazer inicialmente é definir uma classe e seus métodos. Muita coisa aqui vai ser retomada posteriormente, com uma abordagem mais avançada <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Definindo uma classe.</strong></p>
<p><em>Baby</em> <em>Steps</em>, é um conceito que meu amigo <a href="http://www.twitter.com/m3nd3s">@m3nd3s</a> sempre aconselha. Seguindo esse conselho, vamos dar início a esse tópico definindo uma classe bem boba, mas que aborda um aprendizado conciso.</p>
<p>O que precisamos para criar uma classe? Definí-la. É tudo muito simples:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> Ponto
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Ponto

end</pre>
</div>
</div>
<p>Com a palavra chave <em>&#8220;class&#8221;</em> definimos uma classe, seguindo pelo end, que fecha seu escopo. Não sei vocês observaram, a classe foi nomeada com a inicial maiúscula, é uma regra do Ruby, obrigatória por sinal. O nome da constante e o nome da classe são os mesmos, você verá isso posteriormente com mais detalhes.</p>
<p><strong>Instanciando.</strong></p>
<p>Mesmo se não colocarmos nada na classe Ponto, podemos instanciá-la:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :005 <span class="sy0">&gt;</span> <span class="kw3">p</span> = Ponto.<span class="me1">new</span>
<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000106b99c70&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p290 :005 &gt; p = Ponto.new
=&gt; #&lt;Ponto:0x00000106b99c70&gt;</pre>
</div>
</div>
<p>A constante Ponto mantêm em um objeto o que representa a nossa classe. Todos os objetos possuem um método chamado <em>new</em> que é responsável por criar uma nova instância. Não há muita coisa interessante a fazer com esse objeto que criamos, apenas verificar algo do tipo:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :006 <span class="sy0">&gt;</span> <span class="kw3">p</span>.<span class="kw1">class</span>
<span class="sy0">=&gt;</span> Ponto
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :008 <span class="sy0">&gt;</span> <span class="kw3">p</span>.<span class="me1">is_a</span>?Ponto
<span class="sy0">=&gt;</span> <span class="kw2">true</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p290 :006 &gt; p.class
=&gt; Ponto

ruby-1.9.2-p290 :008 &gt; p.is_a?Ponto
=&gt; true</pre>
</div>
</div>
<p><strong>Inicializando.</strong></p>
<p>Se você veio de outras linguagens orientadas a objeto, certamente deve conhecer o termo &#8220;construtor&#8221;, é exatamente isso que<br />
o <em>initialize</em> faz.</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> Ponto
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> initialize<span class="br0">&#40;</span>x,y<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">@x</span>, <span class="re1">@y</span> = x,y
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Ponto

   def initialize(x,y)
       @x, @y = x,y
   end

end</pre>
</div>
</div>
<p>Com esse método definido, podemos criar outros ponteiros e ver o seu retorno.</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :008 <span class="sy0">&gt;</span> <span class="kw3">p</span> = Ponto.<span class="me1">new</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">10</span><span class="br0">&#41;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000105dd6fc0 @x=1, @y=10&gt;</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :009 <span class="sy0">&gt;</span> <span class="kw3">p</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000105dd6fc0 @x=1, @y=10&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p290 :008 &gt; p = Ponto.new(1,10)
 =&gt; #&lt;Ponto:0x00000105dd6fc0 @x=1, @y=10&gt;

ruby-1.9.2-p290 :009 &gt; p
 =&gt; #&lt;Ponto:0x00000105dd6fc0 @x=1, @y=10&gt;</pre>
</div>
</div>
<p>Repare bem nas variáveis de instância x e y, que ja foram inicializadas para o objeto corrente com o valor de 1 e 10 para x e y, respectivamente.<br />
<strong>Acessores e Atributos</strong></p>
<p>Como falei anteriormente, a classe Ponto utiliza duas variáveis de instância, contudo, o valor dessas variáveis estão acessiveis apenas para outros métodos de instância. Isto significa se quisermos que outros objetos da classe queiram utilizar métodos para acessar o valor de X e Y, teremos que fornecer métodos acessores que retornariam os valores dessas variáveis.</p>
<p>Ao pé da letra, para quem vem de outras linguagens Orientadas a Objeto, faríamos assim:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> Ponto
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> initialize<span class="br0">&#40;</span>x,y<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">@x</span>, <span class="re1">@y</span> = x,y
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> x
&nbsp; &nbsp; &nbsp; <span class="re1">@x</span>
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> y
&nbsp; &nbsp; &nbsp; <span class="re1">@y</span>
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Ponto

   def initialize(x,y)
       @x, @y = x,y
   end

   def x
      @x
   end

   def y
      @y
   end

end</pre>
</div>
</div>
<p>Uma vez definindo esses métodos, poderíamos fazer isso:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :023 <span class="sy0">&gt;</span> <span class="kw3">p</span> = Ponto.<span class="me1">new</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">2</span><span class="br0">&#41;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000105db3700 @x=1, @y=2&gt;</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :024 <span class="sy0">&gt;</span> q = Ponto.<span class="me1">new</span><span class="br0">&#40;</span><span class="kw3">p</span>.<span class="me1">x</span><span class="sy0">*</span><span class="nu0">2</span>, <span class="kw3">p</span>.<span class="me1">y</span><span class="sy0">*</span><span class="nu0">3</span><span class="br0">&#41;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000105dab870 @x=2, @y=6&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p290 :023 &gt; p = Ponto.new(1,2)
 =&gt; #&lt;Ponto:0x00000105db3700 @x=1, @y=2&gt;

ruby-1.9.2-p290 :024 &gt; q = Ponto.new(p.x*2, p.y*3)
 =&gt; #&lt;Ponto:0x00000105dab870 @x=2, @y=6&gt;</pre>
</div>
</div>
<p>Agora, para fazermos um setter, faríamos algo do tipo:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> Ponto
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> initialize<span class="br0">&#40;</span>x,y<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">@x</span>, <span class="re1">@y</span> = x,y
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> x
&nbsp; &nbsp; &nbsp; <span class="re1">@x</span>
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> y
&nbsp; &nbsp; &nbsp; <span class="re1">@y</span>
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> x=<span class="br0">&#40;</span>value<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">@x</span> = value
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> y=<span class="br0">&#40;</span>value<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="re1">@y</span> = value
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Ponto

   def initialize(x,y)
       @x, @y = x,y
   end

   def x
      @x
   end

   def y
      @y
   end

   def x=(value)
       @x = value
   end

   def y=(value)
       @y = value
   end

end</pre>
</div>
</div>
<p>Dessa forma, modificaríamos o valor da variável de instância do objeto corrente da seguinte jeito:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :045 <span class="sy0">&gt;</span> <span class="kw3">p</span> = Ponto.<span class="me1">new</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000105d790f0 @x=1, @y=1&gt;</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :046 <span class="sy0">&gt;</span> <span class="kw3">p</span>.<span class="me1">x</span> = <span class="nu0">0</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="nu0">0</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :047 <span class="sy0">&gt;</span> <span class="kw3">p</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000105d790f0 @x=0, @y=1&gt;</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :048 <span class="sy0">&gt;</span> <span class="kw3">p</span>.<span class="me1">y</span> = <span class="nu0">50</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="nu0">50</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :049 <span class="sy0">&gt;</span> <span class="kw3">p</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000105d790f0 @x=0, @y=50&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p290 :045 &gt; p = Ponto.new(1,1)
 =&gt; #&lt;Ponto:0x00000105d790f0 @x=1, @y=1&gt;

ruby-1.9.2-p290 :046 &gt; p.x = 0
 =&gt; 0

ruby-1.9.2-p290 :047 &gt; p
 =&gt; #&lt;Ponto:0x00000105d790f0 @x=0, @y=1&gt;

ruby-1.9.2-p290 :048 &gt; p.y = 50
 =&gt; 50

ruby-1.9.2-p290 :049 &gt; p
 =&gt; #&lt;Ponto:0x00000105d790f0 @x=0, @y=50&gt;</pre>
</div>
</div>
<p>Porém, com ruby podemos simplificar a nossa vida, muitas vezes com apenas uma linha. Nesse exemplo, seguiremos o legado rubyway e faremos os <em>getters</em> e <em>setters</em> em apenas duas linhas:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> Ponto
&nbsp;
&nbsp; &nbsp;attr_accessor : x, <span class="re3">:y</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Ponto

   attr_accessor : x, :y

end</pre>
</div>
</div>
<p>Faça a mesma coisa agora no terminal para você ver o retorno:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :065 <span class="sy0">&gt;</span> <span class="kw3">p</span> = Ponto.<span class="me1">new</span><span class="br0">&#40;</span><span class="nu0">10</span>,<span class="nu0">10</span><span class="br0">&#41;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000105d1a528 @x=10, @y=10&gt;</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :066 <span class="sy0">&gt;</span> <span class="kw3">p</span>.<span class="me1">x</span> = <span class="nu0">20</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="nu0">20</span>
&nbsp;
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p290 :067 <span class="sy0">&gt;</span> <span class="kw3">p</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000105d1a528 @x=20, @y=10&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p290 :065 &gt; p = Ponto.new(10,10)
 =&gt; #&lt;Ponto:0x00000105d1a528 @x=10, @y=10&gt;

ruby-1.9.2-p290 :066 &gt; p.x = 20
 =&gt; 20

ruby-1.9.2-p290 :067 &gt; p
 =&gt; #&lt;Ponto:0x00000105d1a528 @x=20, @y=10&gt;</pre>
</div>
</div>
<p>Existem os métodos <em>attr_writer</em> (setter), <em>attr_reader</em> (getter) e o que utilizamos, o <em>attr_accessor</em> (getter e setter), eles são responsáveis por criarem métodos de instância para nós <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Esse é um exemplo clássico de <em>metaprogramação, </em>e a habilidade de fazer isso é um dos maiores recursos que o ruby oferece.</p>
<p><strong>Métodos de Classe.</strong></p>
<p>Para quem já conhece a Orientação a Objetos, sabe que um método de classe pode ser acessado apenas pela própria classe seja lá onde ele for chamado. Isto é, no exemplo que estamos seguindo, o método de classe que vamos criar agora não é um método de instância que seria chamado em um objeto Ponto.</p>
<p>A chamada para o método de classe seria algo como:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1">total = Ponto.<span class="me1">soma</span><span class="br0">&#40;</span>p1, p2,p3<span class="br0">&#41;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">total = Ponto.soma(p1, p2,p3)</pre>
</div>
</div>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> Ponto
&nbsp;
&nbsp; &nbsp;attr_reader : x, <span class="re3">:y</span>
&nbsp;
&nbsp; &nbsp;<span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">soma</span><span class="br0">&#40;</span><span class="sy0">*</span>pontos<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp;x = y = <span class="nu0">0</span>
&nbsp; &nbsp; &nbsp; &nbsp;pontos.<span class="me1">each</span> <span class="br0">&#123;</span><span class="sy0">|</span>p<span class="sy0">|</span> x <span class="sy0">+</span>= <span class="kw3">p</span>.<span class="me1">x</span>; y <span class="sy0">+</span>= <span class="kw3">p</span>.<span class="me1">y</span><span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp;Ponto.<span class="me1">new</span><span class="br0">&#40;</span>x,y<span class="br0">&#41;</span>
&nbsp; &nbsp;<span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Ponto

   attr_reader : x, :y

   def self.soma(*pontos)
       x = y = 0
       pontos.each {|p| x += p.x; y += p.y}
       Ponto.new(x,y)
   end

end</pre>
</div>
</div>
<p>Dessa forma, estaremos acessando a soma de todos os x e y de cada ponto através de um método de classe <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Constantes.</strong></p>
<p>Várias classes podem ser beneficiadas por uma associação e definição de algumas constantes, eis um exemplo:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> Ponto
&nbsp;
<span class="kw1">def</span> initialize<span class="br0">&#40;</span>x,y<span class="br0">&#41;</span>
&nbsp;
&nbsp; &nbsp; <span class="re1">@x</span>, <span class="re1">@y</span> = x,y
&nbsp;
<span class="kw1">end</span>
&nbsp;
ORIGEM = Ponto.<span class="me1">new</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp;
COORD_X = Ponto.<span class="me1">new</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp;
COORD_Y = Ponto.<span class="me1">new</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#91;</span>...<span class="br0">&#93;</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class Ponto

def initialize(x,y)

    @x, @y = x,y

end

ORIGEM = Ponto.new(0,0)

COORD_X = Ponto.new(1,0)

COORD_Y = Ponto.new(0,1)

[...]

end</pre>
</div>
</div>
<p>Uma vez dentro da classe, as constantes podem ser acessadas pelos nomes, diretamente. Caso estejam fora, para serem acessadas, devem estar acompanhada no nome da classe, como no exemplo:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="re2">Ponto::COORD_X</span> <span class="sy0">+</span> <span class="re2">PONTO::CORD_Y</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">Ponto::COORD_X + PONTO::CORD_Y</pre>
</div>
</div>
<p>Você pode inicializar até mesmo fora da classe:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :<span class="nu0">206</span> <span class="sy0">&gt;</span> <span class="re2">Ponto::COORD_X</span> = Ponto.<span class="me1">new</span><span class="br0">&#40;</span><span class="nu0">2</span>,<span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;Ponto:0x00000103bb2728 @x=2, @y=0&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :206 &gt; Ponto::COORD_X = Ponto.new(2,0)
 =&gt; #&lt;Ponto:0x00000103bb2728 @x=2, @y=0&gt;</pre>
</div>
</div>
<p>O tópico é enorme, portanto, vou extendê-lo em outros posts. Para o próximo post trarei tópicos que abordam <em><strong>Variáveis de Classe</strong>,</em> <strong><em>Variáveis</em> de Instância</strong> e <strong><em>Visibilidade</em></strong>.</p>
<p>Referências:</p>
<p>http://www.ruby-doc.org/docs/ProgrammingRuby/html/classes.html</p>
<p>http://www.devarticles.com/c/a/Ruby-on-Rails/Ruby-Classes-and-Objects/</p>
<p>http://blog.bluesoft.com.br/ruby-classes-e-objetos/</p>
<!-- AddThis Button BEGIN --> 
<div class="addthis_toolbox addthis_default_style addthis_32x32_style"> 
<a class="addthis_button_compact"></a> 
<a class="addthis_button_googlebuzz"></a> 
<a class="addthis_button_twitter"></a> 
<a class="addthis_button_facebook"></a> 
<a class="addthis_button_linkedin"></a> 
<a class="addthis_button_stumbleupon"></a> 
<a class="addthis_button_digg"></a> 
<a class="addthis_button_misterwong"></a> 
<a class="addthis_button_multiply"></a> 
<a class="addthis_button_hellotxt"></a> 
<a class="addthis_button_bitly"></a> 
<a class="addthis_button_googletranslate"></a> 
<a class="addthis_button_myspace"></a> 
<a class="addthis_button_bebo"></a> 
<a class="addthis_button_amazonwishlist"></a> 
<a class="addthis_button_baidu"></a> 
<a class="addthis_button_blinklist"></a> 
<a class="addthis_button_blip"></a> 
<a class="addthis_button_blogger"></a> 
<a class="addthis_button_faves"></a> 
<a class="addthis_button_formspring"></a> 
<a class="addthis_button_googlereader"></a> 
<a class="addthis_button_hackernews"></a> 
<a class="addthis_button_hotmail"></a> 
<a class="addthis_button_instapaper"></a> 
<a class="addthis_button_myaol"></a> 
<a class="addthis_button_netvibes"></a> 
<a title="Send to CMSVoteUp" href="http://cmsvoteup.com/index.php?page=submit1&url="><img border="0" src="http://cmsvoteup.com/images/cmsvoteup-icon-32x32-2.png"></a> 
<a title="Send to DontClickOn" href="http://dontclickon.com/index.php?page=submit1&url="><img border="0" src="http://dontclickon.com/images/dco-icon-32x32.png"></a> 
</div> 
<script type="text/javascript">var addthis_config = {"data_track_clickback":};</script> 
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid="></script> ]]></content:encoded>
			<wfw:commentRss>http://urieljuliatti.com/2011/10/classes-e-modulos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Quick Post] &#8211; Migrations Para Models Já Existentes.</title>
		<link>http://urieljuliatti.com/2011/10/quick-post-migrations-para-models-ja-existentes/</link>
		<comments>http://urieljuliatti.com/2011/10/quick-post-migrations-para-models-ja-existentes/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 19:24:51 +0000</pubDate>
		<dc:creator>urieljuliatti</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://urieljuliatti.wordpress.com/?p=592</guid>
		<description><![CDATA[Fala pessoal, beleza? Hoje vou demonstrar rapidamente sobre migrations para modelos já existentes. A necessidade surgiu quando tive a necessidade de criar um campo/atributo booleano para um modelo já existente. Presume-se que você já tenha um modelo, no meu caso é o User, que possui apenas um atributo &#8220;name&#8221; e &#8220;email. O Rails fornece um [...]]]></description>
			<content:encoded><![CDATA[<p>Fala pessoal, beleza? Hoje vou demonstrar rapidamente sobre migrations para modelos já existentes.</p>
<p>A necessidade surgiu quando tive a necessidade de criar um campo/atributo booleano para um modelo já existente.</p>
<p>Presume-se que você já tenha um modelo, no meu caso é o User, que possui apenas um atributo &#8220;name&#8221; e &#8220;email.</p>
<p>O Rails fornece um recurso interessante: Migrations, que vai te ajudar bastante a organizar sua base de dados e todo o fluxo possível.</p>
<p>Para criar uma migration para um model existente você fará assim:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1">rails g migration AddHiddenToUser hidden:boolean</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">rails g migration AddHiddenToUser hidden:boolean</pre>
</div>
</div>
<p>Onde o hidden será o campo novo para o modelo User que já existe. O console trará o seguinte:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
</pre>
</td>
<td class="de1">
<pre class="de1">invoke &nbsp;active_record
create &nbsp; &nbsp;db<span class="sy0">/</span>migrate<span class="sy0">/</span><span class="nu0">20111021182503</span>_add_hidden_to_user.<span class="me1">rb</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">invoke  active_record
create    db/migrate/20111021182503_add_hidden_to_user.rb</pre>
</div>
</div>
<p>Ele chama o Active Record e cria um arquivo baseado na linha que você digitou. Aproveite e abra a sua migration gerada, logo você obterá:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="kw1">class</span> AddHiddenToUser <span class="sy0">&lt;</span> <span class="re2">ActiveRecord::Migration</span>
&nbsp;
<span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">up</span>
&nbsp;
add_column <span class="re3">:users</span>, <span class="re3">:hidden</span>, <span class="re3">:boolean</span>
&nbsp;
<span class="kw1">end</span>
&nbsp;
<span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">down</span>
&nbsp;
remove_column <span class="re3">:users</span>, <span class="re3">:hidden</span>
&nbsp;
<span class="kw1">end</span>
&nbsp;
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">class AddHiddenToUser &lt; ActiveRecord::Migration

def self.up

add_column :users, :hidden, :boolean

end

def self.down

remove_column :users, :hidden

end

end</pre>
</div>
</div>
<p>Lindo! O Rails reconheceu que você quer adicionar um atributo do tipo boolean para uma tabela Users (add_column :users, :hidden, :boolean)</p>
<p>Até agora o rails fez todo o esqueleto, porém nada ainda funciona. Para isso funcionar, você vai ter que rodar um rake db:migrate, onde o rails executa uma função que adiciona literalmente o atributo &#8220;hidden&#8221; a sua tabela Users.</p>
<p>Veja o log após a execução do comando:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="sy0">&lt;</span>pre<span class="sy0">&gt;</span>== &nbsp;AddHiddenToUser: migrating ================================================
<span class="sy0">--</span> add_column<span class="br0">&#40;</span><span class="re3">:users</span>, <span class="re3">:hidden</span>, <span class="re3">:boolean</span><span class="br0">&#41;</span>
&nbsp; &nbsp;<span class="sy0">-&gt;</span> 0.0081s
== &nbsp;AddHiddenToUser: migrated <span class="br0">&#40;</span>0.0082s<span class="br0">&#41;</span> =======================================<span class="sy0">&lt;/</span>pre<span class="sy0">&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">&lt;pre&gt;==  AddHiddenToUser: migrating ================================================
-- add_column(:users, :hidden, :boolean)
   -&gt; 0.0081s
==  AddHiddenToUser: migrated (0.0082s) =======================================&lt;/pre&gt;</pre>
</div>
</div>
<p>Lindezidade total, hein?</p>
<p>Para finalizar, basta adicionar o field na view:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="sy0">&lt;</span>pre<span class="sy0">&gt;&lt;%</span>= form_for<span class="br0">&#40;</span>@user<span class="br0">&#41;</span> <span class="kw1">do</span> <span class="sy0">|</span>f<span class="sy0">|</span> <span class="sy0">%&gt;</span>
&nbsp; <span class="sy0">&lt;%</span>= render <span class="st0">&quot;shared/error_messages&quot;</span>, <span class="re3">:target</span> <span class="sy0">=&gt;</span> <span class="re1">@user</span> <span class="sy0">%&gt;</span>
&nbsp;
&nbsp; <span class="sy0">&lt;</span>div <span class="kw1">class</span>=<span class="st0">&quot;field&quot;</span><span class="sy0">&gt;</span>
&nbsp; &nbsp; <span class="sy0">&lt;%</span>= f.<span class="me1">label</span> <span class="re3">:name</span> <span class="sy0">%&gt;&lt;%</span>= mark_required<span class="br0">&#40;</span>@user, <span class="re3">:name</span><span class="br0">&#41;</span> <span class="sy0">%&gt;&lt;</span>br <span class="sy0">/&gt;</span>
&nbsp; &nbsp; <span class="sy0">&lt;%</span>= f.<span class="me1">text_field</span> <span class="re3">:name</span> <span class="sy0">%&gt;</span>
&nbsp; <span class="sy0">&lt;/</span>div<span class="sy0">&gt;</span>
&nbsp; <span class="sy0">&lt;</span>div <span class="kw1">class</span>=<span class="st0">&quot;field&quot;</span><span class="sy0">&gt;</span>
&nbsp; &nbsp; <span class="sy0">&lt;%</span>= f.<span class="me1">label</span> <span class="re3">:email</span> <span class="sy0">%&gt;&lt;%</span>= mark_required<span class="br0">&#40;</span>@user, <span class="re3">:email</span><span class="br0">&#41;</span> <span class="sy0">%&gt;&lt;</span>br <span class="sy0">/&gt;</span>
&nbsp; &nbsp; <span class="sy0">&lt;%</span>= f.<span class="me1">text_field</span> <span class="re3">:email</span> <span class="sy0">%&gt;</span>
&nbsp; <span class="sy0">&lt;/</span>div<span class="sy0">&gt;</span>
&nbsp;<span class="sy0">&lt;</span>div <span class="kw1">class</span>=<span class="st0">&quot;field&quot;</span><span class="sy0">&gt;&lt;/</span>strong<span class="sy0">&gt;</span>
&nbsp; &nbsp; &nbsp;<span class="sy0">&lt;%</span>= f.<span class="me1">label</span> <span class="re3">:hidden</span> <span class="sy0">%&gt;&lt;</span>br <span class="sy0">/&gt;</span>
&nbsp; &nbsp; &nbsp;<span class="sy0">&lt;%</span>= f.<span class="me1">check_box</span> <span class="re3">:hidden</span> <span class="sy0">%&gt;</span>
&nbsp;<span class="sy0">&lt;/</span>div<span class="sy0">&gt;</span>
&nbsp; <span class="sy0">&lt;</span>div <span class="kw1">class</span>=<span class="st0">&quot;actions&quot;</span><span class="sy0">&gt;</span>
&nbsp; &nbsp; <span class="sy0">&lt;%</span>= f.<span class="me1">submit</span> <span class="sy0">%&gt;</span>
&nbsp; <span class="sy0">&lt;/</span>div<span class="sy0">&gt;</span>
<span class="sy0">&lt;%</span> <span class="kw1">end</span> <span class="sy0">%&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">&lt;pre&gt;&lt;%= form_for(@user) do |f| %&gt;
  &lt;%= render "shared/error_messages", :target =&gt; @user %&gt;

  &lt;div class="field"&gt;
    &lt;%= f.label :name %&gt;&lt;%= mark_required(@user, :name) %&gt;&lt;br /&gt;
    &lt;%= f.text_field :name %&gt;
  &lt;/div&gt;
  &lt;div class="field"&gt;
    &lt;%= f.label :email %&gt;&lt;%= mark_required(@user, :email) %&gt;&lt;br /&gt;
    &lt;%= f.text_field :email %&gt;
  &lt;/div&gt;
 &lt;div class="field"&gt;&lt;/strong&gt;
     &lt;%= f.label :hidden %&gt;&lt;br /&gt;
     &lt;%= f.check_box :hidden %&gt;
 &lt;/div&gt;
  &lt;div class="actions"&gt;
    &lt;%= f.submit %&gt;
  &lt;/div&gt;
&lt;% end %&gt;</pre>
</div>
</div>
<p>Antes de concluir, um detalhe importante que percebi ao implementar essa funcionalidade é que o Rails fornece funcionalidades bacanas ao acrescentar uma migration dessa forma. Abra o seu console e teste da seguinte forma:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :004 <span class="sy0">&gt;</span> user = User.<span class="me1">first</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="co1">#&lt;User id: 1, name: &quot;Uriel&quot;, email: &quot;uriel.juliattivalle@gmail.com&quot;, created_at: &quot;2011-10-21 18:39:36&quot;, updated_at: &quot;2011-10-21 18:39:36&quot;, hidden: true&gt;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :005 <span class="sy0">&gt;</span> user.<span class="me1">hidden</span>?
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">true</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :004 &gt; user = User.first
 =&gt; #&lt;User id: 1, name: "Uriel", email: "uriel.juliattivalle@gmail.com", created_at: "2011-10-21 18:39:36", updated_at: "2011-10-21 18:39:36", hidden: true&gt;
ruby-1.9.2-p136 :005 &gt; user.hidden?
 =&gt; true</pre>
</div>
</div>
<p>Uma vez que seu atributo é do tipo Boolean, o rails fornece um helper method chamado &#8220;hidden?&#8221; que retorna true ou false. Muito útil, uma vez que outras situações teríamos que fazê-lo na mão, apesar de simples tomaria um certo tempo.</p>
<p>Semana que vem tem RubyConf2011! Ainda dá tempo de se cadastrar <a href="http://rubyconf2011.akitaonrails.com/en/">http://rubyconf2011.akitaonrails.com/en/</a></p>
<p>É isso aí rapazeada, vamo que vamo!</p>
<!-- AddThis Button BEGIN --> 
<div class="addthis_toolbox addthis_default_style addthis_32x32_style"> 
<a class="addthis_button_compact"></a> 
<a class="addthis_button_googlebuzz"></a> 
<a class="addthis_button_twitter"></a> 
<a class="addthis_button_facebook"></a> 
<a class="addthis_button_linkedin"></a> 
<a class="addthis_button_stumbleupon"></a> 
<a class="addthis_button_digg"></a> 
<a class="addthis_button_misterwong"></a> 
<a class="addthis_button_multiply"></a> 
<a class="addthis_button_hellotxt"></a> 
<a class="addthis_button_bitly"></a> 
<a class="addthis_button_googletranslate"></a> 
<a class="addthis_button_myspace"></a> 
<a class="addthis_button_bebo"></a> 
<a class="addthis_button_amazonwishlist"></a> 
<a class="addthis_button_baidu"></a> 
<a class="addthis_button_blinklist"></a> 
<a class="addthis_button_blip"></a> 
<a class="addthis_button_blogger"></a> 
<a class="addthis_button_faves"></a> 
<a class="addthis_button_formspring"></a> 
<a class="addthis_button_googlereader"></a> 
<a class="addthis_button_hackernews"></a> 
<a class="addthis_button_hotmail"></a> 
<a class="addthis_button_instapaper"></a> 
<a class="addthis_button_myaol"></a> 
<a class="addthis_button_netvibes"></a> 
<a title="Send to CMSVoteUp" href="http://cmsvoteup.com/index.php?page=submit1&url="><img border="0" src="http://cmsvoteup.com/images/cmsvoteup-icon-32x32-2.png"></a> 
<a title="Send to DontClickOn" href="http://dontclickon.com/index.php?page=submit1&url="><img border="0" src="http://dontclickon.com/images/dco-icon-32x32.png"></a> 
</div> 
<script type="text/javascript">var addthis_config = {"data_track_clickback":};</script> 
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid="></script> ]]></content:encoded>
			<wfw:commentRss>http://urieljuliatti.com/2011/10/quick-post-migrations-para-models-ja-existentes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desafios no Caminho.</title>
		<link>http://urieljuliatti.com/2011/09/desafios-no-caminho/</link>
		<comments>http://urieljuliatti.com/2011/09/desafios-no-caminho/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 16:36:05 +0000</pubDate>
		<dc:creator>urieljuliatti</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[giran]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby-challenge]]></category>

		<guid isPermaLink="false">http://urieljuliatti.wordpress.com/?p=527</guid>
		<description><![CDATA[A Vida. Desde quando comecei a minha jornada no mundo do desenvolvimento na Giran (@giran_br), tenho tido contato com inúmeras novidades, entre elas: A prática do versionar software (Git). Documentação de Software. Metodologias Ágeis. Uso freqüente do terminal (o/).  Simpatia pelo Macbook (não consigo me imaginar utilizando outra máquina ou qualquer outro SO que não [...]]]></description>
			<content:encoded><![CDATA[<p><strong>A Vida.<br />
</strong></p>
<p>Desde quando comecei a minha jornada no mundo do desenvolvimento na Giran (<a href="http://www.twitter.com/giran_br">@giran_br</a>), tenho tido contato com inúmeras novidades, entre elas:</p>
<ul>
<li>A prática do versionar software (Git).</li>
<li>Documentação de Software.</li>
<li>Metodologias Ágeis.</li>
<li>Uso freqüente do terminal (o/).</li>
<li> Simpatia pelo Macbook (não consigo me imaginar utilizando outra máquina ou qualquer outro SO que não seja baseado no kernel Unix).</li>
<li>Testes (Um alô para Flávia Missi (<a href="http://www.twitter.com/flaviamissi">@flaviamissi</a>) e por todo o legado de preocupações com testes que ela deixou enquanto estava no time).</li>
<li>Participações em coding dojos.</li>
<li>Pão Caseiro (via <a href="http://www.twitter.com/m3nd3s">@m3nd3s</a>).</li>
<li>A comunicação diária usando a língua inglesa por conta do nosso parceiro Petros (Grego Belezidade!) me deixa muito motivado.</li>
<li>Essa equipe é fo**!</li>
<li>Existe empresa que se esforça para cuidar do seu funcionário, sem balelas ou merchanda gratuito.</li>
</ul>
<p>São inúmeras, eu não listei todas. Entretanto, todas elas têm mudado aos poucos minha visão como desenvolvedor, profissional e sim, é possível, como ser humano.</p>
<p><strong>O Dojo.</strong></p>
<p><a href="http://urieljuliatti.com/wp-content/uploads/2011/09/dojo2.jpg"><img class="size-medium wp-image-528 alignnone" style="border:1px solid black;margin:1px;" title="Dojo" src="http://urieljuliatti.com/wp-content/uploads/2011/09/dojo2.jpg?w=300" alt="" width="300" height="180" /></a><a href="http://urieljuliatti.com/wp-content/uploads/2011/09/dojo.jpg"><img class="size-medium wp-image-534 alignnone" style="border:1px solid black;margin:1px;" title="Petrozinho + Eu." src="http://urieljuliatti.com/wp-content/uploads/2011/09/dojo.jpg?w=300" alt="" width="270" height="210" /></a></p>
<p>Digamos que o conceito de coding dojo seja, além de ser um desafio para programadores, é também se divertir, e, &#8220;através de uma metodologia pragmática, melhorar suas habilidades de programação e de trabalho em grupo&#8221;.</p>
<p>Pois é, pode aparentar irrisório o que vou falar, mas nem só de vitórias vivemos.. E as minhas últimas experiências com dojo têm sido frustrantes quanto ao meu desempenho pessoal, mas o dojo em si está sendo uma experiência sensacional e desafiadora.</p>
<p>Falando sobre a pseudo frustração, se você conhece alguém que nunca tenha tido um deslize, com certeza essa pessoa não é humana. Erros são inerentes à natureza (e não só a nossa, acredite), a única diferença é de como enfrentamos.</p>
<p>Só fui dar conta ultimamente , pois estava codando de maneira afobada e ansiosa por resultados instantâneos. E a minha ficha caiu de verdade quando eu congelei em um dojo com amigos na empresa. Eu poderia descrever inúmeros fatores que contribuíram para esse infortúnio, falar que sou &#8220;iniciante&#8221; e afobado ao mesmo tempo contaria como 80% da causa (haha <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ), certo? Errado, há motivos para se importar por tão pouco!? Conclusão que só cheguei com ajuda de amigos na empresa e pessoas mais próximas fora dela.</p>
<p>É óbvio que nesse post não vou postar sobre as soluções que vou tomar daqui para frente, pois estou buscando-as, mas ao contrário do que até mesmo eu esperava, ao me deparar com uma derrapada dessas tive uma vontade ainda maior de aprender mais e mais.</p>
<p><strong>O Código e o Caminho do Guerreiro.</strong></p>
<p>Depois dessas lamúrias sobre o dojo.. Um desafio eu enfrentar escolhi (Ahhh Yoda!!).</p>
<p>Acostumado a acompanhar os livros e viciado a não praticar com exemplos mais , digamos assim, &#8220;relevantes&#8221;, resolvi tomar uma iniciativa mais aprimorada (é claro que vai depender do seu ponto de vista e experiência).</p>
<p>Escolhi um problema de um dojo (<a href="http://dojopuzzles.com/problemas/exibe/jokenpo/">http://dojopuzzles.com/problemas/exibe/jokenpo/</a>) como referência e resolvi praticá-lo &#8220;sozinho&#8221; na hora do meu almoço, sem seguir as regras do dojo.</p>
<p>OBS: Sozinho?! Oi?! Seria uma blasfêmia dizer que fiz um dojo sozinho, não faz sentido, mas vocês entenderam! <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para acessar o repositório git com a resolução: <a href="http://www.github.com/urieljuliatti/ruby-challenges">http://www.github.com/urieljuliatti/ruby-challenges</a><strong></strong></p>
<p><strong>Todo</strong> <strong>e qualquer feedback</strong> será bem vindo! Pode descer a lenha também, eu aceitarei o desafio <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<!-- AddThis Button BEGIN --> 
<div class="addthis_toolbox addthis_default_style addthis_32x32_style"> 
<a class="addthis_button_compact"></a> 
<a class="addthis_button_googlebuzz"></a> 
<a class="addthis_button_twitter"></a> 
<a class="addthis_button_facebook"></a> 
<a class="addthis_button_linkedin"></a> 
<a class="addthis_button_stumbleupon"></a> 
<a class="addthis_button_digg"></a> 
<a class="addthis_button_misterwong"></a> 
<a class="addthis_button_multiply"></a> 
<a class="addthis_button_hellotxt"></a> 
<a class="addthis_button_bitly"></a> 
<a class="addthis_button_googletranslate"></a> 
<a class="addthis_button_myspace"></a> 
<a class="addthis_button_bebo"></a> 
<a class="addthis_button_amazonwishlist"></a> 
<a class="addthis_button_baidu"></a> 
<a class="addthis_button_blinklist"></a> 
<a class="addthis_button_blip"></a> 
<a class="addthis_button_blogger"></a> 
<a class="addthis_button_faves"></a> 
<a class="addthis_button_formspring"></a> 
<a class="addthis_button_googlereader"></a> 
<a class="addthis_button_hackernews"></a> 
<a class="addthis_button_hotmail"></a> 
<a class="addthis_button_instapaper"></a> 
<a class="addthis_button_myaol"></a> 
<a class="addthis_button_netvibes"></a> 
<a title="Send to CMSVoteUp" href="http://cmsvoteup.com/index.php?page=submit1&url="><img border="0" src="http://cmsvoteup.com/images/cmsvoteup-icon-32x32-2.png"></a> 
<a title="Send to DontClickOn" href="http://dontclickon.com/index.php?page=submit1&url="><img border="0" src="http://dontclickon.com/images/dco-icon-32x32.png"></a> 
</div> 
<script type="text/javascript">var addthis_config = {"data_track_clickback":};</script> 
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid="></script> ]]></content:encoded>
			<wfw:commentRss>http://urieljuliatti.com/2011/09/desafios-no-caminho/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Tipo de Dados e Objetos em Ruby &#8211; Objetos</title>
		<link>http://urieljuliatti.com/2011/09/tipo-de-dados-e-objetos-em-ruby-objetos/</link>
		<comments>http://urieljuliatti.com/2011/09/tipo-de-dados-e-objetos-em-ruby-objetos/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 13:47:47 +0000</pubDate>
		<dc:creator>urieljuliatti</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[Rails 3]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[object-oriented]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby1.9.2]]></category>

		<guid isPermaLink="false">http://urieljuliatti.wordpress.com/?p=487</guid>
		<description><![CDATA[Provavelmente essa cobertura será uma das maiores até então, pois tratarei de explicar os Objetos em ruby. Apesar de extensa, ela é essencial para se entender ruby. Pesquisei algumas referências na internet, mas a maior parte delas será a do livro que estou acompanhando: The Ruby Programming Language, com um foco direcionado ao Ruby 1.9.x [...]]]></description>
			<content:encoded><![CDATA[<p>Provavelmente essa cobertura será uma das maiores até então, pois tratarei de explicar os Objetos em ruby. Apesar de extensa, ela é essencial para se entender ruby. Pesquisei algumas referências na internet, mas a maior parte delas será a do livro que estou acompanhando: <em><strong>The Ruby Programming Language</strong>, </em>com um foco direcionado ao <em>Ruby <strong>1.9.x</strong></em> .</p>
<p>Inicialmente, o ruby é uma linguagem quase toda orientada a objetos, eu disse &#8220;quase&#8221; porque existem uns que dizem que não, outros dizem que sim, a discussão é bem longa. Todavia, em ruby todos os valores são objetos e não há uma distinção entre valores primitivos e objetos, como acontece em outras linguagens. Todos os objetos herdam da classe Object e compartilham entre si métodos definidos por essa classe.</p>
<p><strong>Não.</strong><br />
Não vou ensinar orientação a objetos. Para ler esse artigo, presume-se que já entenda os conceitos básicos da orientação a objetos. </p>
<p><em>Bora lá?</em></p>
<p><strong>Referências a objetos.</strong><br />
A classe Object define dois métodos muito parecidos para copiar objetos.<br />
Quando trabalhamos com objetos em ruby, estamos nada mais nada a menos do que trabalhando com a sua referência, não o objeto em si.</p>
<p>Nada melhor do que um código para visualizar o que acontece:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :090 <span class="sy0">&gt;</span> s = <span class="st0">&quot;Ruby&quot;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;Ruby&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :091 <span class="sy0">&gt;</span> t = s
&nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;Ruby&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :092 <span class="sy0">&gt;</span> t<span class="br0">&#91;</span><span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#93;</span> = <span class="st0">&quot;&quot;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :093 <span class="sy0">&gt;</span> <span class="kw3">print</span> s
Rub <span class="sy0">=&gt;</span> <span class="kw2">nil</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :094 <span class="sy0">&gt;</span> t = <span class="st0">&quot;Java&quot;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;Java&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :095 <span class="sy0">&gt;</span> <span class="kw3">print</span> s,t
RubJava <span class="sy0">=&gt;</span> <span class="kw2">nil</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :096 <span class="sy0">&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :090 &gt; s = "Ruby"
 =&gt; "Ruby"
ruby-1.9.2-p136 :091 &gt; t = s
 =&gt; "Ruby"
ruby-1.9.2-p136 :092 &gt; t[-1] = ""
 =&gt; ""
ruby-1.9.2-p136 :093 &gt; print s
Rub =&gt; nil
ruby-1.9.2-p136 :094 &gt; t = "Java"
 =&gt; "Java"
ruby-1.9.2-p136 :095 &gt; print s,t
RubJava =&gt; nil
ruby-1.9.2-p136 :096 &gt;</pre>
</div>
</div>
<p>Na ordem, criamos um objeto do tipo String e guardamos uma referência para ele em <em>s</em>. Em seguida, copiamos a mesma referência para o t, onde s e t agora estão fazendo uma referência para o mesmo objeto.<br />
Na terceira linha nós modificamos o objeto em que a referência está guardada em t e mandamos printá-lo na linha seguida, retornando modificado.<br />
Na penúltima linha, referenciamos para um novo objeto (s), diferente de t.<br />
E por fim, na última linha printamos os dois objetos.</p>
<p><strong>Nota interessante</strong>: Engraçado é que se você está acostumado com C ou C++, fatalmente pensará que estamos lidando <em>diretamente</em> com ponteiros. Ô, ô!  Engana-se quem pensa, pois ruby não permite você usar ponteiros para manipulação , aritimética e desreferenciação, como alguns já devem ter visto. As referências em ruby são implícitas na implementação, completamante abstraídas.</p>
<p>Quando passamos um objeto para um método uma referência ao objeto é passada, não o objeto em si e nem mesmo uma referência para a referência. A maneira mais segura de dizer é que os argumentos são passados por valor.</p>
<p><strong>Tempo de vida do objeto.</strong><br />
Para dar início ao ciclo de vida de um objeto em Ruby necessitamos de um método chamado &#8220;new&#8221; existente na classe <em>Class</em>. Ele aloca memória para o novo objeto e então inicializa seu estado como vazio ao chamar um outro método &#8220;initialize&#8221;. Como padrão, boa parte das classes possuem um inicializador para executar qualquer tipo de inicialização (caso necessário) para as instâncias.</p>
<p>Os objetos em ruby não precisam ser explicitamente desalocados, assim como é feito em C ou C++ onde precisamos executar um <em>free()</em> para desalocar. O ruby usa uma técnica já conhecida, a de <em>garbage collection</em>, para destruir automaticamente objetos que não estão sendo necessários. Um objeto se torna candidato do garbage quando ele está &#8220;inalcançável&#8221; , isto é, quando não existem referências para aquele objeto a não ser de outros objetos &#8220;inalcançáveis&#8221;.</p>
<p><em>Obs1: Aqueles que desejam um aprofundamento sobre o assunto, existem alguns artigos na Ruby Inside sobre o GC, tal como <a href="http://www.rubyinside.com/how-ruby-manages-memory-and-garbage-collection-3006.html">esse aqui</a>, por exemplo.</p>
<p>Obs2: Apesar de usar o GC , isto não significa que problemas com alocação de memória não existam em Ruby.</em></p>
<p><strong>A classe Object e o tipo Object.</strong></p>
<p>Há várias maneiras de determinar uma classe de um objeto em Ruby. A forma mais simplista é acrescentar um .class no objeto para o interpretador devolver a classe.<br />
Ex:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :022 <span class="sy0">&gt;</span> objeto = <span class="st0">&quot;teste&quot;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;teste&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :023 <span class="sy0">&gt;</span> objeto.<span class="kw1">class</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw3">String</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :022 &gt; objeto = "teste"
 =&gt; "teste"
ruby-1.9.2-p136 :023 &gt; objeto.class
 =&gt; String</pre>
</div>
</div>
<p>A não ser que você queira saber a hierarquia de um objeto, você pode navegar pelas superclasses, assim:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :024 <span class="sy0">&gt;</span> o.<span class="kw1">class</span>.<span class="me1">superclass</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw4">Object</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :025 <span class="sy0">&gt;</span> o.<span class="kw1">class</span>.<span class="me1">superclass</span>.<span class="me1">superclass</span>
&nbsp;<span class="sy0">=&gt;</span> BasicObject
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :026 <span class="sy0">&gt;</span> o.<span class="kw1">class</span>.<span class="me1">superclass</span>.<span class="me1">superclass</span>.<span class="me1">superclass</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">nil</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :024 &gt; o.class.superclass
 =&gt; Object
ruby-1.9.2-p136 :025 &gt; o.class.superclass.superclass
 =&gt; BasicObject
ruby-1.9.2-p136 :026 &gt; o.class.superclass.superclass.superclass
 =&gt; nil</pre>
</div>
</div>
<p>Obs: No 1.9, a classe Object não é a classe raiz dos objetos, mas sim a BasicObject (<a href="http://ruby-doc.org/core-1.9/classes/BasicObject.html">Veja mais na documentação</a>).</p>
<p>Há várias maneiras de saber se tal objeto pertence a uma determinada classe, desde comparativos diretos (objeto.class == String) até o mais elegante de todos, o objeto.<em>instance_of?</em>String.</p>
<p>Geralmente, quando testamos uma classe de um objeto, também desejamos saber se o objeto é uma instância de alguma subclasse. Para fazer essa verificação, usa-se o <em>is_a?</em> ou <em>kind_of?</em>. Ex:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :027 <span class="sy0">&gt;</span> object = <span class="nu0">1</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="nu0">1</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :028 <span class="sy0">&gt;</span> object.<span class="me1">instance_of</span>?<span class="kw4">Fixnum</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">true</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :029 <span class="sy0">&gt;</span> object.<span class="me1">instance_of</span>?<span class="kw4">Numeric</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">false</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :030 <span class="sy0">&gt;</span> object.<span class="me1">is_a</span>?<span class="kw4">Fixnum</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">true</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :031 <span class="sy0">&gt;</span> object.<span class="me1">is_a</span>?<span class="kw3">Integer</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">true</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :032 <span class="sy0">&gt;</span> object.<span class="me1">is_a</span>?<span class="kw4">Numeric</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">true</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :033 <span class="sy0">&gt;</span> object.<span class="me1">is_a</span>?<span class="kw4">Comparable</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">true</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :034 <span class="sy0">&gt;</span> object.<span class="me1">is_a</span>?<span class="kw4">Object</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">true</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :027 &gt; object = 1
 =&gt; 1
ruby-1.9.2-p136 :028 &gt; object.instance_of?Fixnum
 =&gt; true
ruby-1.9.2-p136 :029 &gt; object.instance_of?Numeric
 =&gt; false
ruby-1.9.2-p136 :030 &gt; object.is_a?Fixnum
 =&gt; true
ruby-1.9.2-p136 :031 &gt; object.is_a?Integer
 =&gt; true
ruby-1.9.2-p136 :032 &gt; object.is_a?Numeric
 =&gt; true
ruby-1.9.2-p136 :033 &gt; object.is_a?Comparable
 =&gt; true
ruby-1.9.2-p136 :034 &gt; object.is_a?Object
 =&gt; true</pre>
</div>
</div>
<p>Perceba que na situação em que <em>object.instance_of?Numeric</em> retorna falso, ele não chega a herança. Porém, se você faz o comparativo com <em>object.is_a?Numeric</em>, ele retorna true.</p>
<p>Cada objeto tem uma classe bem definida em Ruby, tal classe nunca muda durante o ciclo de vida de um objeto. Porém, um <em>tipo de objeto</em> é mais flexível, pois está relacionado a sua classe, mas a classe é apenas uma parte de um tipo de objeto. Quando falo sobre tipos de objetos, estou me referenciando a um <strong><em>conjunto de comportamentos que caracterizam o objeto</em></strong>.</p>
<p>Algo importante para lembrar ao programar ruby é o fato de que não se dá tanta importância as classes de um objeto, queremos apenas saber se podemos chamar um método dela. Considere,por exemplo, o operador &#8220;&lt;&lt;&#8221;. Arrays, strings, arquivos e outras classes responsáveis por entrada/saída definem genericamente esse operador como um anexador. Para esclarecer, não damos importância aos argumentos passados para a classe, sabemos que pode ser anexado usando o operador &lt;&lt;. Até podemos testar se a classe responde a esse operador utilizando o respond_to?</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :004 <span class="sy0">&gt;</span> object = <span class="st0">&quot;Teste&quot;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;Teste&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :005 <span class="sy0">&gt;</span> object.<span class="me1">respond_to</span>? :<span class="st0">&quot;&lt; true</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :004 &gt; object = "Teste"
 =&gt; "Teste"
ruby-1.9.2-p136 :005 &gt; object.respond_to? :"&lt; true</pre>
</div>
</div>
<p>Aí sim, estamos testando apenas se o operador pode ser chamado na classe String, não os parâmetros para o método.</p>
<p><strong>Semelhanças entre os objetos</strong><br />
O ruby fornece várias maneiras de comparar objetos pela sua semelhança e é importante saber como alguns métodos funcionam.</p>
<p><strong>O método <em>equal?</em></strong></p>
<p>O método <strong>equal?</strong> (Fornecido pela classe Object) é responsável por verificar se dois valores referem-se exatamente ao mesmo objeto.</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :006 <span class="sy0">&gt;</span> a = <span class="st0">&quot;Ruby&quot;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;Ruby&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :007 <span class="sy0">&gt;</span> b = c = <span class="st0">&quot;Ruby&quot;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;Ruby&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :008 <span class="sy0">&gt;</span> a.<span class="me1">equal</span>?<span class="br0">&#40;</span>b<span class="br0">&#41;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">false</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :009 <span class="sy0">&gt;</span> b.<span class="me1">equal</span>?<span class="br0">&#40;</span>c<span class="br0">&#41;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">true</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :006 &gt; a = "Ruby"
 =&gt; "Ruby"
ruby-1.9.2-p136 :007 &gt; b = c = "Ruby"
 =&gt; "Ruby"
ruby-1.9.2-p136 :008 &gt; a.equal?(b)
 =&gt; false
ruby-1.9.2-p136 :009 &gt; b.equal?(c)
 =&gt; true</pre>
</div>
</div>
<p><em>a</em> e <em>b</em> são objetos diferentes, mas <em>b</em> e <em>c</em> possuem referências para o mesmo objeto.</p>
<p>Outra maneira para realizar a mesma operação é verificar se o object_id é igual.</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :014 <span class="sy0">&gt;</span> a.<span class="me1">object_id</span> == b.<span class="me1">object_id</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">false</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :015 <span class="sy0">&gt;</span> b.<span class="me1">object_id</span> == c.<span class="me1">object_id</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">true</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :014 &gt; a.object_id == b.object_id
 =&gt; false
ruby-1.9.2-p136 :015 &gt; b.object_id == c.object_id
 =&gt; true</pre>
</div>
</div>
<p><strong>Conversão de Objetos</strong><br />
Várias classes no ruby definem métodos que retornam uma representação do objeto como um valor de uma classe distinta. O método <em>to_s</em>, por exemplo, é utilizado para obter uma representação em String de um objeto.</p>
<p>Algumas conversões são explícitas: to_s (String), to_i (Integer), to_f (Float), to_a (Array). Outras são implícitas, em alguns casos quando a classe possui características marcantes de outra classe.</p>
<p><strong>Copiando Objetos</strong><br />
A classe Object possui dois métodos bastante parecidos para lidar com cópias de objetos. Tanto o clone ou dup retorna uma cópia superficial do objeto sobre o qual eles são chamados. Se o objeto copiado possuir um estado interno que se referencie a outros objetos, apenas as referências do objeto serão copiadas, não os próprios objetos referenciados.</p>
<p>Se o objeto que está sendo copiado em questão define um método initialize_copy, <em>clone</em> e <em>dup</em> alocam uma instância nova e vazia da classe e chamam o initialize_copy nessa instância vazia. O objeto em questão a ser copiado é passado como um argumento e essa &#8220;cópia do construtor&#8221; pode inicializar a cópia como ela desejar.. Por exemplo, o método initialize_copy poderia copiar recursivamente os dados internos de um objeto de modo a que o objeto resultante não seja uma simples cópia superficial do original.</p>
<p>As classes também podem sobrescrever diretamente o método <em>clone</em> e <em>dup</em> para resultarem qualquer cópia que desejarem.</p>
<p>Existem duas diferenças importantes entre os métodos <em>clone</em> e <em>dup</em> que são definidos pela classe Object. Em primeiro lugar, <em>clone</em> copia tanto o estado <em>freeze</em> e o <em>tainted</em> (definido em primeira instância) de um objeto, enquanto que <em>dup</em> apenas copia o estado <em>tainted</em>; chamando <em>dup</em> em um objeto freeze retorna uma cópia sem o estado freeze. Em segundo lugar, clone copia todos os métodos singleton do objeto, enquanto o dup não.</p>
<p><strong>Empacotando (serializando) objetos</strong><br />
Você pode salvar um estado de um objeto ao passá-lo como parâmetro para um método de classe Marshal.dump. Caso você passe um objeto de Entrada/Saída como segundo argumento, Marshal.dump determina o estado do objeto (e recursivamente, qualquer objeto que esteja sendo referenciado), caso contrário retorna um estado codificado como String binária.</p>
<p>Para recuperar um objeto serializado, passe uma string ou um fluxo de entrada/saída contendo o objeto para o método Marshal.load.</p>
<p>Serializar um objeto é um jeito bacana de guardar o estado para um uso futuro, além do que esses métodos podem ser utilizados para fornecer um formato automático de arquivos para apps em Ruby.</p>
<p><strong>Congelando Objetos</strong><br />
Qualquer objeto pode ser &#8220;congelado&#8221; ao chamar o método <em>freeze</em>. Um objeto &#8220;congelado&#8221; é considerádo imutável &#8211; isto é, nenhum de seus estados podem ser modificados e a tentativa de chamar qualquer método que seja capaz de modificar será falha.</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar" style="right: 15px;" >
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple"style=" height: 252px;">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">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
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :001 <span class="sy0">&gt;</span> s = <span class="st0">&quot;ice&quot;</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;ice&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :002 <span class="sy0">&gt;</span> s.<span class="me1">freeze</span>
&nbsp;<span class="sy0">=&gt;</span> <span class="st0">&quot;ice&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :003 <span class="sy0">&gt;</span> s.<span class="me1">frozen</span>?
&nbsp;<span class="sy0">=&gt;</span> <span class="kw2">true</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :004 <span class="sy0">&gt;</span> s.<span class="me1">upcase</span>!
<span class="kw4">RuntimeError</span>: can<span class="st0">'t modify frozen string</span>
<span class="st0">&nbsp; &nbsp; from (irb):4:in `upcase!'</span>
&nbsp; &nbsp; from <span class="br0">&#40;</span>irb<span class="br0">&#41;</span>:<span class="nu0">4</span>
&nbsp; &nbsp; from <span class="sy0">/</span>Users<span class="sy0">/</span>urieljuliatti<span class="sy0">/</span>.<span class="me1">rvm</span><span class="sy0">/</span>gems<span class="sy0">/</span>ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136@rails<span class="sy0">-</span>3.0.1<span class="sy0">/</span>gems<span class="sy0">/</span>railties<span class="sy0">-</span>3.0.1<span class="sy0">/</span>lib<span class="sy0">/</span>rails<span class="sy0">/</span>commands<span class="sy0">/</span>console.<span class="me1">rb</span>:<span class="nu0">44</span>:<span class="kw1">in</span> <span class="st0">`start'</span>
<span class="st0">&nbsp; &nbsp; from /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p136@rails-3.0.1/gems/railties-3.0.1/lib/rails/commands/console.rb:8:in `</span>start<span class="st0">'</span>
<span class="st0">&nbsp; &nbsp; from /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p136@rails-3.0.1/gems/railties-3.0.1/lib/rails/commands.rb:23:in `'</span>
&nbsp; &nbsp; from script<span class="sy0">/</span>rails:<span class="nu0">6</span>:<span class="kw1">in</span> <span class="st0">`require'</span>
<span class="st0">&nbsp; &nbsp; from script/rails:6:in `</span><span class="st0">'</span>
<span class="st0">ruby-1.9.2-p136 :005 &gt; s[0] = &quot;ni&quot;</span>
<span class="st0">RuntimeError: can'</span>t modify frozen <span class="kw3">string</span>
&nbsp; &nbsp; from <span class="br0">&#40;</span>irb<span class="br0">&#41;</span>:<span class="nu0">5</span>:<span class="kw1">in</span> <span class="st0">`[]='</span>
<span class="st0">&nbsp; &nbsp; from (irb):5</span>
<span class="st0">&nbsp; &nbsp; from /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p136@rails-3.0.1/gems/railties-3.0.1/lib/rails/commands/console.rb:44:in `</span>start<span class="st0">'</span>
<span class="st0">&nbsp; &nbsp; from /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p136@rails-3.0.1/gems/railties-3.0.1/lib/rails/commands/console.rb:8:in `start'</span>
&nbsp; &nbsp; from <span class="sy0">/</span>Users<span class="sy0">/</span>urieljuliatti<span class="sy0">/</span>.<span class="me1">rvm</span><span class="sy0">/</span>gems<span class="sy0">/</span>ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136@rails<span class="sy0">-</span>3.0.1<span class="sy0">/</span>gems<span class="sy0">/</span>railties<span class="sy0">-</span>3.0.1<span class="sy0">/</span>lib<span class="sy0">/</span>rails<span class="sy0">/</span>commands.<span class="me1">rb</span>:<span class="nu0">23</span>:<span class="kw1">in</span> <span class="st0">`'</span>
<span class="st0">&nbsp; &nbsp; from script/rails:6:in `</span><span class="kw3">require</span><span class="st0">'</span>
<span class="st0">&nbsp; &nbsp; from script/rails:6:in `'</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :006 <span class="sy0">&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :001 &gt; s = "ice"
 =&gt; "ice"
ruby-1.9.2-p136 :002 &gt; s.freeze
 =&gt; "ice"
ruby-1.9.2-p136 :003 &gt; s.frozen?
 =&gt; true
ruby-1.9.2-p136 :004 &gt; s.upcase!
RuntimeError: can't modify frozen string
	from (irb):4:in `upcase!'
	from (irb):4
	from /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p136@rails-3.0.1/gems/railties-3.0.1/lib/rails/commands/console.rb:44:in `start'
	from /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p136@rails-3.0.1/gems/railties-3.0.1/lib/rails/commands/console.rb:8:in `start'
	from /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p136@rails-3.0.1/gems/railties-3.0.1/lib/rails/commands.rb:23:in `'
	from script/rails:6:in `require'
	from script/rails:6:in `'
ruby-1.9.2-p136 :005 &gt; s[0] = "ni"
RuntimeError: can't modify frozen string
	from (irb):5:in `[]='
	from (irb):5
	from /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p136@rails-3.0.1/gems/railties-3.0.1/lib/rails/commands/console.rb:44:in `start'
	from /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p136@rails-3.0.1/gems/railties-3.0.1/lib/rails/commands/console.rb:8:in `start'
	from /Users/urieljuliatti/.rvm/gems/ruby-1.9.2-p136@rails-3.0.1/gems/railties-3.0.1/lib/rails/commands.rb:23:in `'
	from script/rails:6:in `require'
	from script/rails:6:in `'
ruby-1.9.2-p136 :006 &gt;</pre>
</div>
</div>
<p><strong>Objetos Estranhos ou Duvidosos. </strong></p>
<p><em>*Tentei encontrar alguma tradução eficiente para Tainted Objects, sem sucesso<strong>.</strong></em></p>
<p><em><strong></strong></em>Geralmente, as aplicações web devem manter o controle de dados derivados da entrada de um usuário não confiável para evitar ataques de injeção SQL e tasks de segurança semelhantes.</p>
<p>O Ruby fornece uma solução simples para esse problema: Qualquer objeto pode ser marcado como &#8220;duvidoso&#8221;, chamando-o pelo método <strong><em>taint</em></strong>. E isso gera uma reação em cadeia, pois a partir do momento que um objeto é setado como taint, qualquer objeto derivado será taint também.</p>
<p>Segue o exemplo para analisarmos o que acontece quando setamos um objeto como taint:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
</pre>
</td>
<td class="de1">
<pre class="de1">ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :001 <span class="sy0">&gt;</span> s = <span class="st0">&quot;untrusted&quot;</span>
<span class="sy0">=&gt;</span> <span class="st0">&quot;untrusted&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :002 <span class="sy0">&gt;</span> s.<span class="me1">taint</span>
<span class="sy0">=&gt;</span> <span class="st0">&quot;untrusted&quot;</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :003 <span class="sy0">&gt;</span> s.<span class="me1">tainted</span>?
<span class="sy0">=&gt;</span> <span class="kw2">true</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :004 <span class="sy0">&gt;</span> s.<span class="me1">upcase</span>.<span class="me1">tainted</span>?
<span class="sy0">=&gt;</span> <span class="kw2">true</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :005 <span class="sy0">&gt;</span> s<span class="br0">&#91;</span><span class="nu0">3</span>,<span class="nu0">4</span><span class="br0">&#93;</span>.<span class="me1">tainted</span>?
<span class="sy0">=&gt;</span> <span class="kw2">true</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">ruby-1.9.2-p136 :001 &gt; s = "untrusted"
=&gt; "untrusted"
ruby-1.9.2-p136 :002 &gt; s.taint
=&gt; "untrusted"
ruby-1.9.2-p136 :003 &gt; s.tainted?
=&gt; true
ruby-1.9.2-p136 :004 &gt; s.upcase.tainted?
=&gt; true
ruby-1.9.2-p136 :005 &gt; s[3,4].tainted?
=&gt; true</pre>
</div>
</div>
<p>É uma abordagem que será interessante ter uma cobertura específica, pois envolve questões de segurança e de como o Ruby lida com isso. Portanto, resumi apenas demonstrá-los do poder que a linguagem possui, pois infelizmente não terá como cobrir todo o tema. Futuramente pretendo estudar alguns critérios específicos sobre essa abordagem do Ruby <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Por fim, gostaria de informar que a próxima abordagem será sobre <strong><em>Classes e Módulos</em></strong>.</p>
<p>Bons estudos a todos!</p>
<p>Referências:</p>
<p>http://www.devarticles.com/c/a/Ruby-on-Rails/Ruby-Classes-and-Objects/1/</p>
<p>http://rubylearning.com/blog/2010/11/03/do-you-understand-rubys-objects-messages-and-blocks/</p>
<p>http://www.hokstad.com/ruby-object-model.html</p>
<p>http://www.linuxtopia.org/online_books/programming_books/ruby_tutorial/Locking_Ruby_in_the_Safe_Tainted_Objects.html</p>
<!-- AddThis Button BEGIN --> 
<div class="addthis_toolbox addthis_default_style addthis_32x32_style"> 
<a class="addthis_button_compact"></a> 
<a class="addthis_button_googlebuzz"></a> 
<a class="addthis_button_twitter"></a> 
<a class="addthis_button_facebook"></a> 
<a class="addthis_button_linkedin"></a> 
<a class="addthis_button_stumbleupon"></a> 
<a class="addthis_button_digg"></a> 
<a class="addthis_button_misterwong"></a> 
<a class="addthis_button_multiply"></a> 
<a class="addthis_button_hellotxt"></a> 
<a class="addthis_button_bitly"></a> 
<a class="addthis_button_googletranslate"></a> 
<a class="addthis_button_myspace"></a> 
<a class="addthis_button_bebo"></a> 
<a class="addthis_button_amazonwishlist"></a> 
<a class="addthis_button_baidu"></a> 
<a class="addthis_button_blinklist"></a> 
<a class="addthis_button_blip"></a> 
<a class="addthis_button_blogger"></a> 
<a class="addthis_button_faves"></a> 
<a class="addthis_button_formspring"></a> 
<a class="addthis_button_googlereader"></a> 
<a class="addthis_button_hackernews"></a> 
<a class="addthis_button_hotmail"></a> 
<a class="addthis_button_instapaper"></a> 
<a class="addthis_button_myaol"></a> 
<a class="addthis_button_netvibes"></a> 
<a title="Send to CMSVoteUp" href="http://cmsvoteup.com/index.php?page=submit1&url="><img border="0" src="http://cmsvoteup.com/images/cmsvoteup-icon-32x32-2.png"></a> 
<a title="Send to DontClickOn" href="http://dontclickon.com/index.php?page=submit1&url="><img border="0" src="http://dontclickon.com/images/dco-icon-32x32.png"></a> 
</div> 
<script type="text/javascript">var addthis_config = {"data_track_clickback":};</script> 
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid="></script> ]]></content:encoded>
			<wfw:commentRss>http://urieljuliatti.com/2011/09/tipo-de-dados-e-objetos-em-ruby-objetos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tipo de Dados e Objetos em Ruby &#8211; Symbols</title>
		<link>http://urieljuliatti.com/2011/08/tipo-de-dados-e-objetos-em-ruby-symbols/</link>
		<comments>http://urieljuliatti.com/2011/08/tipo-de-dados-e-objetos-em-ruby-symbols/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 12:12:26 +0000</pubDate>
		<dc:creator>urieljuliatti</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[Rails 3]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby 1.9.2]]></category>
		<category><![CDATA[symbols]]></category>

		<guid isPermaLink="false">http://urieljuliatti.wordpress.com/?p=455</guid>
		<description><![CDATA[Fala pessoa, beleza?! Hoje o assunto é Symbol e pelo o que andei lendo na internet, somado ao livro que estou acompanhando, ele é um enorme enigma para vários programadores. Se você experimentar procurar na internet sobre o assunto, vai encontrar diversas discussões e diversas opiniões sobre a relevância do uso de Symbol. Funcionamento: Em [...]]]></description>
			<content:encoded><![CDATA[<p>Fala pessoa, beleza?!</p>
<p>Hoje o assunto é Symbol e pelo o que andei lendo na internet, somado ao livro que estou acompanhando, ele é um enorme enigma para vários programadores. Se você experimentar procurar na internet sobre o assunto, vai encontrar diversas discussões e diversas opiniões sobre a relevância do uso de Symbol.</p>
<p><em><strong>Funcionamento:</strong></em> Em uma implementação comum , o interpretador do Ruby mantém uma tabela da classe Symbol que reserva os nomes de todas as classes, métodos e variáveis que se conhece. Isto permite que o interpretador evite comparações exageradas na cadeia de Strings, ele tenta sempre referir a nomes de métodos por sua posição nesta tabela de símbolos.</p>
<p>O engraçado do Symbol é a forma de inicialização ou instanciamento da própria classe:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="re3"> <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> la_symbol</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse"> <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> la_symbol</pre>
</div>
</div>
<p>Normalmente, para inicializar uma classe usa-se a chamada &#8220;new&#8221; procedida pelo método &#8216;initialize&#8217; definido dentro da classe.</p>
<p>Lendo um artigo do Akita, além de ter uma cobertura mais abrangente do tópico que estou lendo no livro do Matz, descobri que o método initialize da classe Symbol é privado, isto é, ele força todo símbolo a ser instanciado com a notação de dois-pontos.</p>
<p>Um dos motivos dos símbolos existirem é que se toda hora instanciarmos uma String, estaremos criando vários objetos para uma mesma causa onde o problema poderia ser resolvido por constantes. Vamos visualizar como isso fica?</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
7
8
9
10
</pre>
</td>
<td class="de1">
<pre class="de1"><span class="sy0">&lt;</span>pre<span class="sy0">&gt;</span>ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :002 <span class="sy0">&gt;</span> <span class="st0">&quot;string&quot;</span>.<span class="me1">object_id</span>
<span class="sy0">=&gt;</span> <span class="nu0">2154639100</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :003 <span class="sy0">&gt;</span> <span class="st0">&quot;string&quot;</span>.<span class="me1">object_id</span>
<span class="sy0">=&gt;</span> <span class="nu0">2154627240</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :004 <span class="sy0">&gt;</span> <span class="st0">&quot;string&quot;</span>.<span class="me1">object_id</span>
<span class="sy0">=&gt;</span> <span class="nu0">2154611460</span> <span class="co1"># veja quantos ids diferentes foram criados..</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :005 <span class="sy0">&gt;</span> :<span class="kw3">string</span>.<span class="me1">object_id</span>
<span class="sy0">=&gt;</span> <span class="nu0">108168</span>
ruby<span class="sy0">-</span>1.9.2<span class="sy0">-</span>p136 :006 <span class="sy0">&gt;</span> :<span class="kw3">string</span>.<span class="me1">object_id</span>
<span class="sy0">=&gt;</span> <span class="nu0">108168</span> <span class="co1"># percebam o mesmo id para os simbolos</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">&lt;pre&gt;ruby-1.9.2-p136 :002 &gt; "string".object_id
=&gt; 2154639100
ruby-1.9.2-p136 :003 &gt; "string".object_id
=&gt; 2154627240
ruby-1.9.2-p136 :004 &gt; "string".object_id
=&gt; 2154611460 # veja quantos ids diferentes foram criados..
ruby-1.9.2-p136 :005 &gt; :string.object_id
=&gt; 108168
ruby-1.9.2-p136 :006 &gt; :string.object_id
=&gt; 108168 # percebam o mesmo id para os simbolos</pre>
</div>
</div>
<p>Essa solução já existe em outras linguagens, porém no Ruby, ao invés de declarar uma constante</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1">&nbsp;CATEGORY = <span class="st0">&quot;category&quot;</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse"> CATEGORY = "category"</pre>
</div>
</div>
<p>e depois usá-la</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1">&nbsp;belongs_to CATEGORY </pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse"> belongs_to CATEGORY </pre>
</div>
</div>
<p>o Ruby encontrou uma maneira mais elegante de tratar esse caso, especificamente sobre a sua sintaxe.</p>
<p>Para concluir: O principal objetivo dos símbolos é &#8220;ser tão eficiente em consumo de memória quanto constantes mas tão agradáveis aos olhos como strings&#8221; (via @akitaonrails).</p>
<p>Existem mais coisas sobre Symbols por aí na web, o que encontrei foi meio confuso</p>
<p>Por fim, nosso próximo post será sobre Objetos, que será bem abrangente!</p>
<!-- AddThis Button BEGIN --> 
<div class="addthis_toolbox addthis_default_style addthis_32x32_style"> 
<a class="addthis_button_compact"></a> 
<a class="addthis_button_googlebuzz"></a> 
<a class="addthis_button_twitter"></a> 
<a class="addthis_button_facebook"></a> 
<a class="addthis_button_linkedin"></a> 
<a class="addthis_button_stumbleupon"></a> 
<a class="addthis_button_digg"></a> 
<a class="addthis_button_misterwong"></a> 
<a class="addthis_button_multiply"></a> 
<a class="addthis_button_hellotxt"></a> 
<a class="addthis_button_bitly"></a> 
<a class="addthis_button_googletranslate"></a> 
<a class="addthis_button_myspace"></a> 
<a class="addthis_button_bebo"></a> 
<a class="addthis_button_amazonwishlist"></a> 
<a class="addthis_button_baidu"></a> 
<a class="addthis_button_blinklist"></a> 
<a class="addthis_button_blip"></a> 
<a class="addthis_button_blogger"></a> 
<a class="addthis_button_faves"></a> 
<a class="addthis_button_formspring"></a> 
<a class="addthis_button_googlereader"></a> 
<a class="addthis_button_hackernews"></a> 
<a class="addthis_button_hotmail"></a> 
<a class="addthis_button_instapaper"></a> 
<a class="addthis_button_myaol"></a> 
<a class="addthis_button_netvibes"></a> 
<a title="Send to CMSVoteUp" href="http://cmsvoteup.com/index.php?page=submit1&url="><img border="0" src="http://cmsvoteup.com/images/cmsvoteup-icon-32x32-2.png"></a> 
<a title="Send to DontClickOn" href="http://dontclickon.com/index.php?page=submit1&url="><img border="0" src="http://dontclickon.com/images/dco-icon-32x32.png"></a> 
</div> 
<script type="text/javascript">var addthis_config = {"data_track_clickback":};</script> 
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid="></script> ]]></content:encoded>
			<wfw:commentRss>http://urieljuliatti.com/2011/08/tipo-de-dados-e-objetos-em-ruby-symbols/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ Quick Post ] &#8211; Configurando ambiente para RSpec2 no Rails 3</title>
		<link>http://urieljuliatti.com/2011/08/quick-post-configurando-ambiente-para-rspec2-no-rails-3/</link>
		<comments>http://urieljuliatti.com/2011/08/quick-post-configurando-ambiente-para-rspec2-no-rails-3/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 11:22:29 +0000</pubDate>
		<dc:creator>urieljuliatti</dc:creator>
				<category><![CDATA[Rails 3]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://urieljuliatti.wordpress.com/?p=425</guid>
		<description><![CDATA[Fala pessoal, beleza?! Hoje tive que lidar com uma configuração de ambiente de testes com RSpec2, pois estou começando no mundo dos testes e queria aplicar alguns conceitos no meu blog que está sendo feito do zero em Rails. O objetivo desse quick post é apenas configurar o ambiente, não vou falar dos testes em [...]]]></description>
			<content:encoded><![CDATA[<p>Fala pessoal, beleza?!</p>
<p>Hoje tive que lidar com uma configuração de ambiente de testes com RSpec2, pois estou começando no mundo dos testes e queria aplicar alguns conceitos no meu blog que está sendo feito do zero em Rails. O objetivo desse quick post é apenas configurar o ambiente, não vou falar dos testes em si.</p>
<p>Uma vez com a sua aplicação já criada, no seu Gemfile, adicione as linhas:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
</pre>
</td>
<td class="de1">
<pre class="de1">group <span class="re3">:development</span>, <span class="re3">:test</span> <span class="kw1">do</span>
&nbsp; gem <span class="st0">'rspec-rails'</span>
<span class="kw1">end</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">group :development, :test do
  gem 'rspec-rails'
end</pre>
</div>
</div>
<p>Agora rode o bundle no terminal para instalar a gem que acabamos de associar ao Gemfile:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1">bundle install</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">bundle install</pre>
</div>
</div>
<p>E para finalizar, precisamos rodar o generator do RSpec. Ele será responsável por criar alguns arquivos que falarei em seguida. Digite no terminal:</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
</pre>
</td>
<td class="de1">
<pre class="de1">rails generate rspec:install</pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">rails generate rspec:install</pre>
</div>
</div>
<p>Como havia dito, esse comando vai gerar alguns arquivos, tais como:</p>
<p>- <strong>.rspec</strong> &#8211; Um arquivo de configuração onde podemos guardar algumas linhas de comando extras para se comunicar com a ferramenta rspec. </p>
<p>- <strong>spec</strong> &#8211; Um diretório que irá conter todos os arquivos de models, controllers, views, aceitação e outros tipos de arquivos spec para a sua aplicação. </p>
<p>- <strong>spec/spec_helper.rb</strong> &#8211; Um helper que será carregado a cada chamada do spec. Ele prepara todo o ambiente de teste, contendo a maioria das configurações do spec, arquivos de ajuda e etc.</p>
<p>Agora toda vez que você criar um Model ou um Controller via rails generator ou scaffolding, ele vai gerar também um arquivo para o spec.</p>
<style type="text/css">
.bwp-syntax-wrapper li {white-space: normal;}
</style>
<div class="bwp-syntax-block clearfix">
<div class="bwp-syntax-toolbar">
<div class="bwp-syntax-control"><a href="javascript:;" class="bwp-syntax-source-switch" title="View Source Code"></a></div>
</div>
<div class="bwp-syntax-wrapper clearfix bwp-syntax-simple">
<table class="ruby">
<tbody>
<tr class="li1">
<td class="ln">
<pre class="de1">1
2
3
4
5
6
</pre>
</td>
<td class="de1">
<pre class="de1">$ rails g model teste
&nbsp; &nbsp; &nbsp; invoke &nbsp;active_record
&nbsp; &nbsp; &nbsp; create &nbsp; &nbsp;db<span class="sy0">/</span>migrate<span class="sy0">/</span><span class="nu0">20110817125934</span>_create_testes.<span class="me1">rb</span>
&nbsp; &nbsp; &nbsp; create &nbsp; &nbsp;app<span class="sy0">/</span>models<span class="sy0">/</span>teste.<span class="me1">rb</span>
&nbsp; &nbsp; &nbsp; invoke &nbsp; &nbsp;rspec
&nbsp; &nbsp; &nbsp; create &nbsp; &nbsp; &nbsp;spec<span class="sy0">/</span>models<span class="sy0">/</span>teste_spec.<span class="me1">rb</span></pre>
</td>
</tr>
</tbody>
</table>
</div>
<div class="bwp-syntax-source">
<pre class="no-parse">$ rails g model teste
      invoke  active_record
      create    db/migrate/20110817125934_create_testes.rb
      create    app/models/teste.rb
      invoke    rspec
      create      spec/models/teste_spec.rb</pre>
</div>
</div>
<p>Após compor o teste, para rodar junto à sua aplicação faça um rake spec:models (no nosso do teste), rake spec para integração, rake spec:views para views e assim vai <img src='http://urieljuliatti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>É isso aí!</p>
<p>Abraços.</p>
<!-- AddThis Button BEGIN --> 
<div class="addthis_toolbox addthis_default_style addthis_32x32_style"> 
<a class="addthis_button_compact"></a> 
<a class="addthis_button_googlebuzz"></a> 
<a class="addthis_button_twitter"></a> 
<a class="addthis_button_facebook"></a> 
<a class="addthis_button_linkedin"></a> 
<a class="addthis_button_stumbleupon"></a> 
<a class="addthis_button_digg"></a> 
<a class="addthis_button_misterwong"></a> 
<a class="addthis_button_multiply"></a> 
<a class="addthis_button_hellotxt"></a> 
<a class="addthis_button_bitly"></a> 
<a class="addthis_button_googletranslate"></a> 
<a class="addthis_button_myspace"></a> 
<a class="addthis_button_bebo"></a> 
<a class="addthis_button_amazonwishlist"></a> 
<a class="addthis_button_baidu"></a> 
<a class="addthis_button_blinklist"></a> 
<a class="addthis_button_blip"></a> 
<a class="addthis_button_blogger"></a> 
<a class="addthis_button_faves"></a> 
<a class="addthis_button_formspring"></a> 
<a class="addthis_button_googlereader"></a> 
<a class="addthis_button_hackernews"></a> 
<a class="addthis_button_hotmail"></a> 
<a class="addthis_button_instapaper"></a> 
<a class="addthis_button_myaol"></a> 
<a class="addthis_button_netvibes"></a> 
<a title="Send to CMSVoteUp" href="http://cmsvoteup.com/index.php?page=submit1&url="><img border="0" src="http://cmsvoteup.com/images/cmsvoteup-icon-32x32-2.png"></a> 
<a title="Send to DontClickOn" href="http://dontclickon.com/index.php?page=submit1&url="><img border="0" src="http://dontclickon.com/images/dco-icon-32x32.png"></a> 
</div> 
<script type="text/javascript">var addthis_config = {"data_track_clickback":};</script> 
<script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#pubid="></script> ]]></content:encoded>
			<wfw:commentRss>http://urieljuliatti.com/2011/08/quick-post-configurando-ambiente-para-rspec2-no-rails-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

