<?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>Klaus Paiva &#187; MVC</title>
	<atom:link href="http://blog.klaus.pro.br/tags/mvc/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.klaus.pro.br</link>
	<description>Idéias e desventuras de Klaus Paiva</description>
	<lastBuildDate>Wed, 08 Sep 2010 19:15:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Criando um formulário de contato simples usando o ActiveRecord</title>
		<link>http://blog.klaus.pro.br/2007/ler/criando-um-formulario-de-contato-simples-usando-o-activerecord/index.html</link>
		<comments>http://blog.klaus.pro.br/2007/ler/criando-um-formulario-de-contato-simples-usando-o-activerecord/index.html#comments</comments>
		<pubDate>Tue, 09 Jan 2007 12:59:03 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://wp.blog.klaus.pro.br/2007/ler/criando-um-formulario-de-contato-simples-usando-o-activerecord/index.html</guid>
		<description><![CDATA[Se você já utilizou o Rails alguma vez, certamente também usou (e provavelmente adorou) a implementação Model-View-Controller (MVC) que existe a sua disposição. Nela podemos representar facilmente uma tabela em um banco de dados como um objeto qualquer. Esta transformação permite a você manipular, editar, consultar, listar, etc&#8230; com facilidade as informações contidas na sua [...]]]></description>
			<content:encoded><![CDATA[<p>Se você já utilizou o <a href="http://www.rubyonrails.org">Rails</a> alguma vez, certamente também usou (e provavelmente adorou) a implementação <a href="http://en.wikipedia.org/wiki/Model-View-Controller"><em>Model-View-Controller</em></a> (MVC) que existe a sua disposição.</p>
<p>Nela podemos representar facilmente uma tabela em um banco de dados como um objeto qualquer. Esta transformação permite a você manipular, editar, consultar, listar, etc&#8230; com facilidade as informações contidas na sua tabela.</p>
<p>Eu estive pensando em criar um <a href="http://wp.blog.klaus.pro.br/mostrar/contato">formulário de contato simples</a>. Porém, sem usar uma tabela no banco de dados (que não faz sentido algum nesse caso) como eu poderia me aproveitar das vantagens do <a href="http://wiki.rubyonrails.com/rails/pages/ActiveRecord"><em>ActiveRecord</em></a>?</p>
<p>Só pra dar uma visão geral sobre o <em>ActiveRecord</em>: é ele quem vai dar a você todos os <a href="http://www.rubyonrails.org/api/classes/ActiveRecord/Base.html">facilitadores</a> na hora de trabalhar com um modelo que representa uma tabela em seu banco de dados.</p>
<p>Como você já deve estar imaginando, estas facilidades só estarão disponíveis, por padrão, se os seus dados estiverem dentro de uma tabela para que o Rails possa ler eles e transformá-los num objeto para você.</p>
<p>Pensando nisso, fiz uma pesquisa e encontrei uma solução que permite criar um modelo que define os campos diretamente, sem a necessidade de uma tabela real. Eu achei um PDF com o <a href="http://wp.blog.klaus.pro.br/pdfs/tableless-contact-form.pdf">artigo</a>, a URL indicada no final do PDF não existe mais. Apenas encontrei <a href="http://railsforum.com/viewtopic.php?id=404">referências em um fórum</a>. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3 id="modelo-sem-tabela" class="subtitles">Criando um modelo que apenas simula uma tabela</h3>
<p>O primeiro passo é criarmos um modelo que nos vai permitir criar outros modelos que não estejam ligados a tabela alguma. O modelo é simples e não precisa de alteração alguma:</p>
<p><code>class TablelessForms &lt; ActiveRecord::Base<br />
def self.columns()<br />
@columns ||= [];<br />
end<br />
def self.column(name, sql_type = nil, default = nil, null = true)<br />
columns &lt;&lt; ActiveRecord::ConnectionAdapters::Column.new(<br />
name.to_s, default, sql_type.to_s, null<br />
)<br />
end<br />
# override the save method to prevent exceptions.<br />
def save(validate = true)<br />
validate ? valid? : true<br />
end<br />
end</code></p>
<p>Basta salvá-lo dentro da sua pasta de modelos (app/models) e pronto. Agora você pode criar um outro modelo para representar sua pseudo-tabela:</p>
<p><code>class ContactForm &lt; TablelessForms</code></p>
<p>column :name,         :string<br />
column :email,        :string<br />
column :site,         :string<br />
column :subject,      :string<br />
column :message_text, :text</p>
<p>validates_presence_of :name,<br />
:message =&gt; &#8216;Seu nome (campo obrigatório)&#8217;<br />
validates_format_of :email,<br />
:with =&gt; /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i,<br />
:message =&gt; &#8216;Seu e-mail (formato inválido)&#8217;<br />
validates_presence_of :subject,<br />
:message =&gt; &#8216;O assunto (campo obrigatório)&#8217;<br />
validates_presence_of :message_text,<br />
:message =&gt; &#8216;Sua mensagem (campo obrigatório)&#8217;</p>
<p>end</p>
<p>Repare que eu criei ali meus campos usando o <em>column</em>. Criei de acordo com os campos que eu queria em <a href="http://wp.blog.klaus.pro.br/mostrar/contato">meu formulário</a>.</p>
<p>Aproveitei e adicionei também todos os <a href="http://www.rubyonrails.org/api/classes/ActiveRecord/Validations/ClassMethods.html">métodos de validação</a> necessários ao meu formulário. Pronto, temos o nosso modelo pronto para uso.</p>
<h3 id="usando" class="subtitles">Usando o modelo em uma <em>action</em></h3>
<p>Agora a parte mais fácil. Se você já usou algum modelo para manipular dados com o Rails vai notar que o funcionamento é basicamente o mesmo, a diferença é que os dados não irão para o banco. =)</p>
<p>Vamos criar uma <em>action</em> para mostrar o nosso formulário ou enviar os dados (caso o formulário seja enviado):</p>
<p><code>def contato<br />
# se o método é get, o formulário ainda não foi enviado, mostramos o form vazio<br />
if request.get?<br />
@contact = ContactForm.new<br />
else<br />
# aqui recebemos o formulário por post, vamos criar o nosso objeto<br />
# usando os parâmetros vindos do formulário<br />
@contact = ContactForm.new( params['contact'] )<br />
# o método save (que foi sobreescrito) vai ativar a validação<br />
if @contact.save<br />
# se está tudo OK com os dados, vamos enviar o e-mail e...<br />
GenericMailer.deliver_contact_me @contact<br />
# ... redirecionar mostrando uma mensagem<br />
display_message 'Sua mensagem foi enviada com sucesso!', 'app-ok', '/mostrar/contato'<br />
end<br />
end<br />
end</code></p>
<p>O template de contato ficou assim (apenas a parte relevante, claro):</p>
<p><code>&lt;%= form_tag( { :method =&gt; 'post' }, :id =&gt; 'contact-me-form' )%&gt;</code></p>
<p>&lt;%= error_messages_for &#8216;contact&#8217; %&gt;</p>
<p>&lt;!&#8211;[form:contact]&#8211;&gt;</p>
<p>&lt;p class=&#8221;hint-form&#8221;&gt;<br />
* campos obrigatórios<br />
&lt;/p&gt;</p>
<p>&lt;div class=&#8221;fields&#8221;&gt;<br />
&lt;label class=&#8221;labels&#8221; for=&#8221;contact_name&#8221;&gt;<br />
Nome &lt;small&gt;*&lt;/small&gt;:<br />
&lt;/label&gt;<br />
&lt;%= text_field &#8216;contact&#8217;, &#8216;name&#8217;, :class =&gt; &#8216;data-field&#8217; %&gt;<br />
&lt;/div&gt;</p>
<p>&lt;div class=&#8221;fields&#8221;&gt;<br />
&lt;label class=&#8221;labels&#8221; for=&#8221;contact_site&#8221;&gt;<br />
Site:<br />
&lt;/label&gt;<br />
&lt;%= text_field &#8216;contact&#8217;, &#8216;site&#8217;, :class =&gt; &#8216;data-field&#8217; %&gt;<br />
&lt;/div&gt;</p>
<p>&lt;div class=&#8221;fields&#8221;&gt;<br />
&lt;label class=&#8221;labels&#8221; for=&#8221;contact_email&#8221;&gt;<br />
E-mail &lt;small&gt;*&lt;/small&gt;:<br />
&lt;/label&gt;<br />
&lt;%= text_field &#8216;contact&#8217;, &#8216;email&#8217;, :class =&gt; &#8216;data-field&#8217; %&gt;<br />
&lt;/div&gt;</p>
<p>&lt;div class=&#8221;fields&#8221;&gt;<br />
&lt;label class=&#8221;labels&#8221; for=&#8221;contact_subject&#8221;&gt;<br />
Assunto &lt;small&gt;*&lt;/small&gt;:<br />
&lt;/label&gt;<br />
&lt;%= text_field &#8216;contact&#8217;, &#8216;subject&#8217;, :class =&gt; &#8216;data-field&#8217; %&gt;<br />
&lt;/div&gt;</p>
<p>&lt;div class=&#8221;fields&#8221;&gt;<br />
&lt;label class=&#8221;labels&#8221; for=&#8221;contact_message_text&#8221;&gt;<br />
Mensagem &lt;small&gt;*&lt;/small&gt;:<br />
&lt;/label&gt;<br />
&lt;%= text_area &#8216;contact&#8217;, &#8216;message_text&#8217;, :class =&gt; &#8216;post-field&#8217; %&gt;<br />
&lt;/div&gt;</p>
<p>&lt;!&#8211;[eoform:comment]&#8211;&gt;</p>
<p>&lt;p class=&#8221;actions&#8221;&gt;<br />
&lt;%= submit_tag &#8216;Enviar&#8217; %&gt;<br />
&lt;/p&gt;</p>
<p>&lt;%= end_form_tag %&gt;</p>
<h3 id="save" class="subtitles">E aquele método <em>save</em> ali?</h3>
<p>Se você reparar no código da classe <em>TablelessForms</em>, ali o método save é sobreescrito.</p>
<p>Ele apenas vai fazer a validação sem tentar fazer alteração alguma no banco (o que geraria erros pois o que temos é uma pseudo-tabela, não uma tabela real).</p>
<h3 id="enviar-email" class="subtitles">Mas e o envio do e-mail?</h3>
<p><a href="http://wiki.rubyonrails.org/rails/pages/HowToSendEmailsWithActionMailer">Enviar e-mails</a> é bastante descomplicado mas, por questão de organização, vou deixar isso como assunto para um próximo post. =)</p>
<h3 id="resumindo" class="subtitles">Resumindo</h3>
<p>Usar a estrutura do <em>ActiveRecord</em> para uma pseudo-tabela foi bem tranquilo de se conseguir. E com os facilitadores que o <em>ActiveRecord</em> permite, gerar o formulário de contato simples foi realmente simples! (com o perdão da redundância! =)</p>
<dl id="refencias" class="references">
<dt>Referências</dt>
<dd> <a href="http://www.rubyonrails.org/">Rails</a> </dd>
<dd> <a href="http://en.wikipedia.org/wiki/Model-View-Controller"><em>Model-View-Controller</em></a> </dd>
<dd> <a href="http://wiki.rubyonrails.com/rails/pages/ActiveRecord">Sobre o <em>ActiveRecord</em></a> </dd>
<dd> <a href="http://www.rubyonrails.org/api/classes/ActiveRecord/Base.html">Métodos gerais disponíveis no <em>ActiveRecord</em></a> </dd>
<dd> <a href="http://wp.blog.klaus.pro.br/pdfs/tableless-contact-form.pdf">O artigo original ensinando a técnica (em PDF)</a> </dd>
<dd> <a href="http://www.rubyonrails.org/api/classes/ActiveRecord/Validations/ClassMethods.html">Métodos de validação no <em>ActiveRecord</em></a> </dd>
<dd> <a href="http://wiki.rubyonrails.org/rails/pages/HowToSendEmailsWithActionMailer">Enviando e-mails</a> </dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2007/ler/criando-um-formulario-de-contato-simples-usando-o-activerecord/index.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Um blog com Ruby on Rails</title>
		<link>http://blog.klaus.pro.br/2007/ler/um-blog-com-ruby-on-rails/index.html</link>
		<comments>http://blog.klaus.pro.br/2007/ler/um-blog-com-ruby-on-rails/index.html#comments</comments>
		<pubDate>Sat, 06 Jan 2007 10:53:09 +0000</pubDate>
		<dc:creator>Klaus Paiva</dc:creator>
				<category><![CDATA[Textos]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://wp.blog.klaus.pro.br/?p=1</guid>
		<description><![CDATA[Após um bom tempo longe do mundo dos blogs, eu estou de volta e dessa vez é pra ficar! =) Aproveitei as férias do trabalho para aprender uma linguagem nova que pudesse substituir meu bom e velho PHP. Não que o PHP não seja uma linguagem boa, longe disso. O fato é que eu precisava [...]]]></description>
			<content:encoded><![CDATA[<p>Após um bom tempo longe do mundo dos blogs, eu estou de volta e dessa vez é pra ficar! =)</p>
<p>Aproveitei as férias do trabalho para aprender uma linguagem nova que pudesse substituir meu bom e velho <a href="http://www.php.net/">PHP</a>.</p>
<p>Não que o PHP não seja uma linguagem boa, longe disso. O fato é que eu precisava de uma linguagem que fizesse mais por mim e, por consequência, eu codifique menos. <img src='http://blog.klaus.pro.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Foi aí que o <a href="http://www.ruby-lang.org/">Ruby</a> (on <a href="http://www.rubyonrails.org/">Rails</a>) surgiu na minha vida.</p>
<h3 id="motivos" class="subtitles">Os motivos</h3>
<p>Na faculdade eu havia visto um pouco sobre <a href="http://www.python.org">Python</a>. Gostei da sintaxe da linguagem em relação ao PHP porém não senti nela um potencial para substituir o PHP e suas inúmeras funções <em>built-in</em>.</p>
<p>No trabalho, sob uma influência bastante positiva do meu amigo <a title="Na verdade, o nome é Fernando =)" href="http://www.simplesideias.com.br/">Ferdinando</a>, eu resolvi que iria apostar no Ruby on Rails. O resultado não poderia ter sido mais positivo!</p>
<h3 id="fontes" class="subtitles">As fontes</h3>
<p>Inicialmente, comecei lendo os famosos &#8220;<em>getting started</em>&#8221; que achei em vários sites, exemplos: <a href="http://www.ruby-lang.org/en/documentation/">http://www.ruby-lang.org/en/documentation/</a> e <a href="http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html">http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html</a>.</p>
<p>Depois disso parti para a leitura dos tutoriais em PDF que o <a href="http://eustaquiorangel.com/">Eustáquio Rangel</a> <a href="http://www.eustaquiorangel.com/files">disponibilizou</a> em seu site. Os PDFs foram bem bacanas e permitiram uma visão geral sobre Ruby (e Rails)..</p>
<p>Minha principal fonte de leitura e aprendizado foi o livro: <a href="http://pragmaticprogrammer.com/titles/rails/index.html">Agile Web Development with Rails</a>. Apesar deste não ter sido o melhor livro sobre programação que eu já li, certamente ele é bem claro na maior parte dos textos.</p>
<h3 id="resultado" class="subtitles">O resultado</h3>
<p>O primeiro resultado&#8230; bem, você está olhando para ele agora! Para praticar o que eu havia visto, resolvi construir um blog!</p>
<p>Peguei papel e caneta e comecei a desenhar os fluxos de navegação. Rascunhei as páginas individualmente e defini como seriam todos os comportamentos. Decidi que o projeto só estaria completo se eu cumprisse todos os requisitos que eu havia descrito.</p>
<p>No final das contas, o resultado ficou além do que eu mesmo havia proposto e o melhor de tudo: eu levei apenas 6 dias para fazer o blog todo, inclusive o layout!</p>
<p>Levando em consideração que esta é a primeira vez que faço algo com Ruby on Rails, é um resultado impressionante.</p>
<p>Obviamente não criei um novo <a href="http://wordpress.com/">WordPress</a>. O blog é simples mas funciona! =)</p>
<h3 id="resumindo" class="subtitles">Resumindo</h3>
<p>Se você chegou até aqui pesquisando sobre Ruby on Rails, fica a minha opinião: é ótimo!</p>
<p>Particularmente, eu não sou muito fã de usar grandes códigos prontos. Mas o Rails é tão bem escrito que as coisas se tornam pateticamente claras e fáceis. Basicamente ele faz todo o trabalho sujo e chato, deixando você focado nos códigos e na lógica.</p>
<p>Tudo isso combinado com a sintaxe limpa do Ruby vai gerar um código limpo e simples, com <strong>realmente</strong> muitas linhas de código a menos que um código em PHP, por exemplo.</p>
<dl id="refencias" class="references">
<dt>Referências</dt>
<dd> <a href="http://www.ruby-lang.org/">Ruby</a> </dd>
<dd> <a href="http://www.rubyonrails.org/">Rails</a> </dd>
<dd> <a href="http://www.eustaquiorangel.com/files">PDFs sobre Ruby e Rails do Eustáquio Rangel</a> </dd>
<dd> <a href="http://pragmaticprogrammer.com/titles/rails/index.html">Agile Web Development with Rails</a> </dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://blog.klaus.pro.br/2007/ler/um-blog-com-ruby-on-rails/index.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
