Estava pensando em escrever um post sobre algumas dicas para o Git, mas quando fui fazer umas pesquisas acabei encontrando esse site, traduzido pela comunidade RailsBr, que é bem interessante.
Fizeram uma divisão bem bacana, assim ficou bem fácil para quem esta começando, principalmente pela tradução para a nossa língua.
É sempre uma chatisse, para quem usar o RVM ter que escrever no console rvm use versao_do_ruby@gemset, mas nem todos sabem que existe um comando no próprio RVM para fazer isso de forma automatizada lol. Abaixo segue o comando:
Significa Ruby Versions Manager, ou um gerenciador de versões Ruby, mas o RVM não é só para gerenciar versões Ruby ele também gerencia um conjunto de gems específicas para cada projeto seu.
Git é um sistema de controle de versão distribuído com ênfase em velocidade. O Git foi inicialmente projetado e desenvolvido por Linus Torvalds para o desenvolvimento do kernel Linux.
É uma linguagem de programação interpretada multiparadigma, de tipagem dinâmica e forte, com gerenciamento de memória automático, originalmente planejada e desenvolvida no Japão em 1995, por Yukihiro “Matz” Matsumoto, para ser usada como linguagem de script. Matz queria uma linguagem de script que fosse mais poderosa do que Perl, e mais orientada a objetos do que Python. Ruby suporta programação funcional, orientada a objetos, imperativa e reflexiva. Foi inspirada principalmente por Python, Perl, Smalltalk, Eiffel, Ada e Lisp, sendo muito similar em vários aspectos a Python.
É um framework livre que promete aumentar velocidade e facilidade no desenvolvimento de sites orientados a banco de dados (database-driven web sites), uma vez que é possível criar aplicações com base em estruturas pré-definidas. Frequentemente referenciado como Rails ou RoR, o Ruby on Rails é um projeto de código aberto escrito na linguagem de programação Ruby. As aplicações criadas utilizando o framework Rails são desenvolvidas com base no padrão de projeto MVC (Model-View-Controller). Atualmente na versão 3.2.
É um sistema operacional baseado em Linux perfeito para notebooks, desktops e servidores. Ele contém todos os aplicativos que você precisa - um navegador web, programas de apresentação, edição de texto, planilha eletrônica, comunicador instantâneo e muito mais.
“Um editor de código fonte que trabalha com todas as linguagens possíveis e imagináveis, no qual você tem recursos para tudo, a qualquer momento, de todas as formas. Parece uma propaganda muito grande, mas o Sublime Text é realmente fantástico e possui recursos que irão ajudar muito a vida de programadores em geral.”
Agora vamos criar um controller para fazer o trabalho de login, crie um diretório users e logo em seguida um controller com nome omniauth_callbacks_controller dentro da pasta. Segue o código:
Vamos adicionar o método find_for_facebook_oauth dentro do model User.
12345678910111213141516
defself.find_for_facebook_oauth(access_token,signed_in_resource=nil)data=access_token.extra.raw_infoifuser=User.where(:email=>data.email).firstuserelse# Create a user with a stub password. User.create!(:email=>data.email,:password=>Devise.friendly_token[0,20],:role=>'user')endenddefself.new_with_session(params,session)super.tapdo|user|ifdata=session["devise.facebook_data"]&&session["devise.facebook_data"]["extra"]["raw_info"]user.email=data["email"]endendend
Não esqueça de habilitar a opção :omniauthable do devise no model User.
Agora abra o arquivo devise.rb que esta em config/initializers e bem no final habilite a opção abaixo:
config.omniauth :facebook, 'APP_ID', 'APP_SECRET'
Pegando sua APP_ID e APP_SECRET
Vá ate esse endereço https://developers.facebook.com/apps e clique no menu aplicativos depois em criar novo aplicativo de um nome para ele e clique em continuar.
Selecione o aplicativo e clique em editar aplicativo, na opção App Domain coloque:
Ex.: dominio.com.br
Clique em Website e coloque o endereço da aplicação
Ex.: http://dominio.com.br/
Agora é so pegar a APP_ID e APP_SECRET e substituir, não esqueça das aspas.
Adicione o link para logar na view e pronto lol.
<%= link_to "Conectar com Facebook", user_omniauth_authorize_path(:facebook) %>
"O que é o Moip?
O Moip é uma empresa de pagamentos online do IG e da Ideiasnet, que possibilita
o envio e recebimento de pagamentos na internet por meio de cartões de crédito,
débito e boleto."
Vamos lá, primeiro vamos criar uma conta para usar o modo de desenvolvimento do Moip aqui
Logamos no sistema e pegamos o token e a key para usarmos na app link
# encoding: utf-8classPaymentsController<ApplicationControllerskip_before_filter:verify_authencity_token,:only=>[:confirmation]defcheckout# pega informaçoes do pagador, meio de pagamento e envia para o MOIP@pagador={:nome=>"Antonio Rogerio Medeiros da SIlva Filho",:login_moip=>"argerim",:email=>"argerim@gmail.com",:tel_cel=>"(89)(89)9986-2058",:apelido=>"Rogerio Medeiros",:identidade=>"SEUCPF",:logradouro=>"conjunto primavera casa 10 quadra d",:numero=>"10",:complemento=>"",:bairro=>"Primavera",:cidade=>"Teresina",:estado=>"PI",:pais=>"BRA",:cep=>"64003-530",:tel_fixo=>"(86)3126-2312"}@credit={:valor=>"500.00",:id_proprio=>"armsfilho-gmail-com",:forma=>"CartaoCredito",:instituicao=>"AmericanExpress",:numero=>"345678901234564",:expiracao=>"08/11",:codigo_seguranca=>"1234",:nome=>"João Silva",:identidade=>"134.277.017.00",:telefone=>"(21)9208-0547",:data_nascimento=>"25/10/1980",:parcelas=>"2",:recebimento=>"AVista",:pagador=>@pagador,:razao=>"Pagamento"}response=MoIP::Client.checkout(@credit)# redireciona usuario para confirmar pagamentoredirect_toMoIP::Client.moip_page(response["Token"])enddefconfirmationifrequest.post?notificador=params#MoIP::Client.notification(params)ifparams[:status_pagamento]=="1"# 1 para pagamento confirmado@user=User.find_by_slug(params[:id_transacao])@user.update_attribute(:locked,false)#aqui eu dou permissão para o usuário logarendrender:nothing=>trueendendend
Coloquei o meu, pois assim fica mais fácil você configurar o seu lol.
Com o Rails 3 veio uma excelente novidade que é o uso do respond_to com respond_with, que se eu não me engano essa ideia veio do Merb, onde acabou deixando o controller um pouco mais enxuto, e também trazendo mais perfomance eliminando blocos necessários.
Então ao gerar um scaffold o Rails monta um controller da seguinte forma:
123456789101112
classDocumentsController<ApplicationController# GET /documents# GET /documents.xmldefindex@documents=Document.allrespond_todo|format|format.html# index.html.erbformat.xml{render:xml=>@documents}endendend
Eu eliminei as outras actions, mas sabemos que exite a repetição do bloco respond_to em todas as outras actions.
Normalmente a index responde a vários formatos, mudando o nosso controller para trabalhar com respond_to e respond_with, podemos retirar o bloco de todas as nossas actions, abaixo um exemplo:
12345678910111213
classDocumentsController<ApplicationControllerrespond_to:html,:js,:xmldefindex@documents=Document.allenddefcreate@document=Document.new(params[:document])@document.slug=SlugGenerator.new(@document.name).slugify!flash[:notice]='Document was successfully created.'if@document.saverespond_with(@document)endend
No exemplo que tem a action create temos respond_with(@document), onde a action ira redirecionar para a action show do objeto, se você quer que ele siga para outra action é so adicionar :location => url
123456
defcreate@document=Document.new(params[:document])@document.slug=SlugGenerator.new(@document.name).slugify!flash[:notice]='Document was successfully created.'if@document.saverespond_with(@document,location=>documents_url)end
É assim que mais ou menos fica um simples controller meu em Rails:
# encoding: utf-8classColorsController<AdminControllerrespond_to:htmldefindex@colors=Color.allenddefshow@color=Color.find_by_slug(params[:id])enddefnew@color=Color.newenddefedit@color=Color.find_by_slug(params[:id])enddefcreate@color=Color.new(params[:color])@color.slug=SlugGenerator.new(@color.name).slugify!flash[:notice]='Color was successfully created.'if@color.saverespond_with(@color)enddefupdate@color=Color.find_by_slug(params[:id])@color.slug=SlugGenerator.new(@color.name).slugify!flash[:notice]='Color was successfully updated.'if@color.update_attributes(params[:color])respond_with(@color)enddefdestroyflash[:notice]='Color was successfully deleted.'ifColor.find_by_slug(params[:id]).destroyrespond_with(@color,:location=>colors_url)endend
Simples e rápido, peguei um controller já pronto nesse último exemplo lol.
Recentemente me veio uma dúvida referênte ao :dependent do Rails, pois eu não queria que um objeto fosse deletado se estivesse associado a outro, então teria que usar assim :dependent => :restrict. Até aqui tudo bem, mas quando eu tentava deletar um objeto associado, sempre gerava uma exception e a página não ficava no layout padrão da app. Bem ainda tranquilo fui até o ApplicationController e adicionei o seguinte código:
Só que ao deletar um objeto sempre redirecionava para a home da aplicação, e não era isso exatamente que eu queria, tinha que ficar na página que estava deletando o objeto, pensei um pouco tentei passar o nome do controller mais ou menos assim:
Resolvi escrever esse post devido a essa seguinte duvida no grupo rails_br:
"Eu criei um arquivo dentro da pasta /lib para manter os estados do Brasil
que vou usar no cadastro da minha app, mas quando chamei na minha via eu
recebo essa mensagem de erro:
"uninitialized constant ActionView::CompiledTemplates::STATES". Também
já adicionei a pasta lib pra ser carregada pelo rails, mas mesmo assim,
não resolveu. O código que usei para adicionar a pasta /lib para o
autoload_paths do rails:
config.autoload_paths << File.join(config.root, "/lib")
O código da minha constante: https://gist.github.com/1822459
O que esta faltando?"
Primeira coisa a fazer é criar uma classe dentro da pasta lib no root da aplicação.
Eu coloquei o nome do arquivo de states.rb
# encoding: utf-8classStatesNAMES=[["AC","Acre"],["AL","Alagoas"],["AM","Amazonas"],["AP","Amapá"],["BA","Bahia"],["CE","Ceará"],["DF","Distrito Federal"],["ES","Espírito Santo"],["GO","Goiás"],["MA","Maranhão"],["MT","Mato Grosso"],["MS","Mato Grosso do Sul"],["MG","Minas Gerais"],["PA","Pará"],["PB","Paraíba"],["PR","Paraná"],["PE","Pernambuco"],["PI","Piauí"],["RJ","Rio de Janeiro"],["RN","Rio Grande do Norte"],["RO","Rondônia"],["RS","Rio Grande do Sul"],["RR","Roraima"],["SC","Santa Catarina"],["SE","Sergipe"],["SP","São Paulo"],["TO","Tocantins"]]end
Em seguida faço um require do arquivo dentro ApplicationController: