Powered By Blogger
Mostrando postagens com marcador Ruby on Rails. Mostrar todas as postagens
Mostrando postagens com marcador Ruby on Rails. Mostrar todas as postagens

segunda-feira, 9 de maio de 2011

Testing destroy methods with capybara

To test destroy controller methods with Capybara
you should load the current session driver the following 2 lines solve the confirmation and data-method="delete":


code:

rack_test_session_wrapper = Capybara.current_session.driver
rack_test_session_wrapper.process :delete, my_controller_path(@item)
#your destroy method path



source:http://blog.ardes.com/2010/4/28/capybara-and-rack-test-sessions-and-http-methods

sexta-feira, 30 de abril de 2010

Monokai theme for Netbeans 6.8

I just adapted the monokai TextMate theme for Netbeans, some functions are different in both editor so I couldn't make it works exactly equals, but it is similar to TextMate version.

download: http://sites.google.com/site/andreluisdurao/Home/monokai_nb.zip

quinta-feira, 22 de abril de 2010

Extra ruby themes in netbeans 6.8

Desde que instalei o Netbeans 6.8 fiquei sem os temas aloha e outros que até o 6.7.1 eram indispensáveis....

Hoje consegui através desse post que ajudou d+

http://www.pasopas.nl/2010/03/netbeans-6-8-aloha-theme-extra-ruby-themes/comment-page-1/#comment-30

sábado, 17 de abril de 2010

/opt/local/lib/ruby/vendor_ruby/1.8/rubygems/spec_fetcher.rb:232: warning: getc is obsolete; use STDIN.getc instead

Apos instalar o ruby 1.8.7 via MacPorts ao instalar novas GEMS pode gerar esse erro
"/opt/local/lib/ruby/vendor_ruby/1.8/rubygems/spec_fetcher.rb:232: warning: getc is obsolete; use STDIN.getc instead"

para arrumar 'e simples: basta setar a variavel de ambiente GEM_HOME
atraves do comando: export GEM_HOME=/opt/local/lib/ruby/gems/1.8

terça-feira, 23 de março de 2010

Excluindo arquivos anexos (paperclip)

Para excluir anexos do paperclip é simples, porém não tinha encontrado na doc.
tenho um model Usuario e o attachment com o nome foto, tentei das seguintes formas:

u=Usuario.find x
u.foto.destroy
u.foto.delete

Porém nenhuma dessas resolveu, a resposta é bem mais simples, bastou fazer o seguinte:

u.foto=nil

u.save

segunda-feira, 8 de fevereiro de 2010

ActionMailer novamente....

Já tinha um ano que vinha usando o actionmailer 2.2.2 e ultimamente estou pesquisando sobre envio de e-mails em background e tive alguns problemas
com o actionmailer para realizar os jobs devido ao fato de que nessa versão
eu precisava de um monkey-patch para ignorar o protocolo tls.

O problema era que o patch não estava sendo aplicado em scripts...

Então decidi migrar para Rails 2.3.5, (lógico que actionmailer 2.3.5 igualmente ).
Imagina onde foi o primeiro problema??? no ActionMailer é claro.

A app não enviava e-mail por nada, retornava um erro de sintaxe (SMTP 517)
que também não encontrei quase nada sobre o erro.
Fui ver nos tickets (abaixo) que era um problema do mailer que não estava gerando a string do campo From: corretamente.

https://rails.lighthouseapp.com/projects/8994/tickets/2340
https://rails.lighthouseapp.com/projects/8994/tickets/3078-actionmailer-233-broke-display-name-support-in-from-address-when-using-smtp
https://rails.lighthouseapp.com/projects/8994/tickets/2945

Embora o problema venha ocorrendo desde o Rails 2.3.3 o fix definitivo está programado para sair somente na versão 2.3.6.

Vi 3 ou 4 soluções diferentes:
3 usavam patches no fonte do Rails
e uma usava um script em /config/initializers

Experimentei somente a solução do script e está funcionando OK!

Criei o arquivo fix_mailer_rails.rb em /config/initializers
conteúdo:

#https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2340
module ActionMailer
class Base
def perform_delivery_smtp(mail)
destinations = mail.destinations
mail.ready_to_send
sender = (mail['return-path'] && mail['return-path'].spec) || Array(mail.from).first

smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
smtp.enable_starttls_auto if smtp_settings[:enable_starttls_auto] && smtp.respond_to?(:enable_starttls_auto)
smtp.start(smtp_settings[:domain], smtp_settings[:user_name], smtp_settings[:password],
smtp_settings[:authentication]) do |smtp|
smtp.sendmail(mail.encoded, sender, destinations)
end
end
end
end

segunda-feira, 6 de julho de 2009

Netbeans em inglês

Como toda vez que mudo de PC ou reinstalo o NetBeans tenho que reconfigurar para usar em inglês pq em ptbr, fica muito estranho para falar a verdade vou repetir mais uma vez:

Tenho que adicionar ao fim da linha "netbeans_default_options" do arquivo etc/netbeans.conf (etc do dir de instalação do netbeans)
a seguinte string :
"-J-Duser.language=en -J-Duser.region=US"

de: http://blogs.sun.com/tao/entry/set_netbeans_user_interface_language

terça-feira, 30 de junho de 2009

apostrofos corretos em querys

Uma coisa boba e que toma tempo (quando não se sabe) é trocar os apostrofos ( ' ) por ( \' ) para serem usados em SQL.

Uma linha simples resolve o problema:
str.gsub!('\'') {|s| %q{\'} }

quarta-feira, 10 de junho de 2009

Upload de arquivos em rails

Como receber e escrever os arquivos passados por upload sem usar plugins?

  • Crie um form com o campo de arquivo na view


<% form_for :my_form, :html => {:multipart => true} do |f| %>
...
Escolha o arquivo : <%= c.file_field :file %
>
...
<% end %>



  • Escrever o arquivo pelo controller


#foi criada um dir temp dentro de public/ para salvar os arquivos
def recebe_arquivo
f = File.new("#{Rails.root}/public/temp/#{params[:my_form][:file].original_filename}", "w+")
f.write params[:my_form][:file].read
f.close
end



Observações:
  1. não esquecer do multipart => true
  2. pode ser usado um temp file

quarta-feira, 3 de junho de 2009

Criptografia AES no Rails

Estava fazendo uma biblioteca com 2 funções básicas de criptografia (crypt e decrypt baseada nesses 2 posts que eu tinha encontrado abaixo:
http://snippets.dzone.com/posts/show/991
e
http://rails.brentsowers.com/2007/12/aes-encryption-and-decryption-in-ruby.html

Fiz meio que uma mistura dos 2 e gerei uma biblioteca para fazer as 2 partes:


class Crypt
require 'openssl'
require 'digest/sha1'
def criptografa(dado,user,iv)
#primeiro conjunto email
saida = Array.new
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
c.encrypt
# O SHA1 da conta do user ou uma coluna Hash única para cada user podem ser usados
c.key = Digest::SHA1.hexdigest(user.conta)
c.iv = iv
e = c.update(dado)
e << c.final
#concatena na saida o resultado cifrado do dado de entrada
saida << e
#CASO SEJA NECESSARIO CRIPTOGRAFAR MAIS DADOS...
#instancie novamente c e repita o processo concatenando na saida o novo valor
return saida
end

#metodo usado para excluir emails e verificar a seguranca da transacao feita por GET
def descriptografa(msg,user,iv)
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
c.decrypt
c.key = Digest::SHA1.hexdigest(user.conta)
c.iv = iv
d = c.update(msg)
d << c.final
return d
end
end

Finalmente, para se ter um valor iv único para a sessão salve o valor após o login usando um filtro ou uma chamada simples após o mesmo.


  #Criando novo valor iv e salvando na session
def new_iv
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
c.encrypt
iv = c.random_iv
session[:valor_iv] = iv
end

Syntax Highlighting para código ruby no blogger

Só para que eu não esqueça vou anotar aqui como é feito o Syntax Highlighting

  1. Instalar a gem syntax

    gem install syntax



  2. Adicionar o CSS abaixo ao código html da página do blogger:


    pre {
    background-color: #f1f1f3;
    color: #112;
    padding: 5px;
    font-family:"bitstream vera sans mono",monaco,"lucida console","courier new",courier,serif;
    font-size: 0.9em;
    overflow: auto;
    margin: 4px 0px;
    width: 95%;
    }



    /* Syntax highlighting */
    pre .normal {}
    pre .comment { color: #005; font-style: italic; }
    pre .keyword { color: #A00; font-weight: bold; }
    pre .method { color: #077; }
    pre .class { color: #074; }
    pre .module { color: #050; }
    pre .punct { color: #447; font-weight: bold; }
    pre .symbol { color: #099; }
    pre .string { color: #944; background: #FFE; }
    pre .char { color: #F07; }
    pre .ident { color: #004; }
    pre .constant { color: #07F; }
    pre .regex { color: #B66; background: #FEF; }
    pre .number { color: #F99; }
    pre .attribute { color: #5bb; }
    pre .global { color: #7FB; }
    pre .expr { color: #227; }
    pre .escape { color: #277; }


  3. Verificar se as variáveis de ambiente GEM_HOME e RUBYOPT estão corretas

    export GEM_HOME=/usr/lib/ruby/gems/1.8/
    export RUBYOPT=rubygems


  4. Executar o script

  5. require 'syntax/convertors/html'

    convertor = Syntax::Convertors::HTML.for_syntax "ruby"
    html = convertor.convert( File.read( "program.rb" ) )

    puts html




Links
(CSS) => http://rails.brentsowers.com/2007/12/formatting-ruby-and-html-code-for-blog.html

(Documentação da GEM syntax) => http://syntax.rubyforge.org/chapter-1.html

quarta-feira, 27 de maio de 2009

prototype e jquery rails

Pra fzr funcionar rápido, sem problema é o seguinte:
Insira o jquery antes do prototype na ordem de includes
 


E ao chamar uma função jquery não use mais o MALDITO $
use como o exemplo do próprio Jquery



...pronto... tudo funcionando sem violência, pancadaria e stress! =P

http://docs.jquery.com/Using_jQuery_with_Other_Libraries

sexta-feira, 8 de maio de 2009

Usando expressões regulares simples no rails

Ontem precisei de verificar se um campo texto estava sendo digitado corretamente conforme uma sintaxe bem parecida com CSV, era para verificar uma lista de extensões de arquivos da seguinte forma ".ext" para uma extensão ".ext,.ext2,.ext3" para mais de uma extensão.
A expressão regular simples seria algo do tipo

.(C|N)+(,.(C|N)+)* onde C=caracteres e N números(0a9)

em ruby a expressão foi muito fácil de ser construida e foi a seguinte
/\.\w+(,\.\w+)*/

\. é o caracter "."
\w qualquer palavra (com ou sem números)


#controller
def verifica_texto(txt)
filtro_ext = /\.\w+(,\.\w+)*/
return filtro_ext.match(lista).to_s
end

Se retornar true é que a expressão está correta.

Quando estava escreendo a expressão usei um avaliador de expressões
http://www.rubular.com/
Ao escrever a expressão ele avalia os resultados dado o conjunto passado
muito bom mesmo

Listas de elementos usados nas expressões

[] faixa de caracteres ([a-z] das letras a até z)
\w caracteres usados em palavras; mesmo que [0-9A-Za-z_]
\W caracteres não usados em palavras
\s espaço; mesmo que [ \t\n\r\f]
\S diferente de espaço
\d números, mesmo que [0-9]
\D diferente de números
\b backspace (0x08) (usado somente em faixas)
\b início ou fim de uma palavra (não usado em faixas)
\B diferente de \b
* zero ou mais repetições
+ uma ou mais repetições
{m,n} de m até n repetiçõ
? no máximo uma ocorrência
| OU (operador lógico)
() conjunto

mais exemplos e explicações em:
http://www.rubyist.net/~slagell/ruby/regexp.html

quinta-feira, 7 de maio de 2009

ActiveRecord::SubclassNotFound: The single-table inheritance mechanism failed to locate the subclass: 'type'

Usando uma tabela que já existia, ao fazer a ligação com o Rails tive esse problema causado por existir uma coluna 'type' que não era String e nem referenciava nada pois não era usada como herança era um banco que rodava com outra aplicação.

Gerou o seguinte erro:

"ActiveRecord::SubclassNotFound: The single-table inheritance mechanism failed to locate
the subclass: 'minhatabela'. This error is raised because the column 'type' is reserved for
storing the class in case of inheritance. Please rename this column if you didn't intend
it to be used for storing the inheritance class or overwrite MeuModel.inheritance_column
to use another column for that information."

Bastou alterar o nome da coluna usada para indicar a herança no model:

class MeuModel <>
set_inheritance_column :ruby_type
.
.
.
end

Onde :ruby_type pode ser qualquer nome como "coluna_heranca", etc.

quarta-feira, 6 de maio de 2009

Ocultando parametros no development.log, ou production.log

Só adicionar no application.rb ou application_controller.rb(rails 2.3.2+)

filter_parameter_logging :senha, :conta, :etc

no caso de ser só na produção

filter_parameter_logging("senha") if RAILS_ENV == "production"

pode-se desabilitar o log dos dados recebidos por post

config.log_level = :warn

fonte: http://weblog.rubyonrails.org/2006/8/21/filtered-parameter-logging

quarta-feira, 29 de abril de 2009

undefined local variable or method `location_of_caller' for Time:Class

undefined local variable or method `location_of_caller' for Time:Class

Time.today ficou obsoleto e retiraram sua funcionalidade no
Rubygems 1.3.2

Um monte de plugins e outros projetos que usam a função today
retornarão esse erro, optei por voltar o rubygems na versão 1.3.1
embora parece que existam alguns fixes

Para remover o rubygems executei o seguinte
para descobrir os diretorios de bibliotecas ruby
ruby -e 'puts $:'

junto com as linhas retornou o diretorio "/usr/local/lib/site_ruby/1.8"
removi os arquivos desse dir

gauntlet_rubygems.rb
rubygems.rb
ubygems.rb

e o diretorio rubygems



veja o tópico original:
https://rubyforge.org/tracker/index.php?func=detail&aid=25564&group_id=126&atid=575

Maldito 1.3.2, tá certo que o Time.today ficou obsoleto, mas não
precisa retirar a função e retornar um erro para isso, retorna um
warning bem +simples e mantém a compatibilidade com projetos antigos, AF!


sexta-feira, 24 de abril de 2009

Removendo acentos HTML

fiz uma classe com uma funcao bem básica baseada na remover_acentos
do plugin brazilian rails, até mandei uma msg pra um dos criadores,
porque queria saber se já existia essa função no pacote e que a mesma
deveria estar até mesmo bem + completa que essa que eu fiz

resumindo:

criei uma classe "meuprojrails/lib/traducao.rb"
#traducao.rb
class Traducao
def remover_acentos_html(texto)
texto = texto.gsub(/(á|à|ã|â|ä)/, 'a').gsub(/(é|è|ê|ë)/, 'e').gsub(/(í|ì|î|ï)/, 'i').gsub(/(ó|ò|õ|ô|ö)/, 'o').gsub(/(ú|ù|û|ü)/, 'u').gsub(/(ç)/, 'c').gsub(/(ñ)/,'n')
texto = texto.gsub(/(Á|À|Ã|Â|Ä)/, 'A').gsub(/(É|È|Ê|Ë)/, 'E').gsub(/(Í|Ì|Î|Ï)/, 'I').gsub(/(Ó|Ò|Õ|Ô|Ö)/, 'O').gsub(/(Ú|Ù|Û|Ü)/, 'U').gsub(/(Ç)/, 'C').gsub(/(Ñ)/,'N')
texto
end
end


Ao chamar no rails eu uso o seguinte:
#meu controller
t=Traducao.new
str = t.
remover_acentos_html("Não!")

.............

quarta-feira, 1 de abril de 2009

Email com anexos

Mais uma vez a documentação me deixou na mão,
com sorte achei um tópico no railsforum.com que literalmente salvou
a construir emails com arquivos anexos, o que é para ser bem simples.

Eu recebo na aplicação alguns arquivos e são salvos usando Paperclip
e posso enviá-los por email.

http://railsforum.com/viewtopic.php?id=2868

fiz umas poucas alterações, e ficou assim no final

#no mailer

def
email_com_anexos(usuario)
subject 'assunto'
recipients 'foo@bar.com'
from 'eumesmo@a.com'
content_type "multipart/mixed"
# Message
part :content_type => "multipart/alternative" do |p|

p.part :content_type => "text/html",
:body => render_message("email_com_anexos.html",
:usuario => usuario)
#p.part :content_type => "text/plain",:body => text_view(myObject)
end

# Attachments
if usuario.arquivo_file_size and usuario.arquivo_file_size > 0
part :content_type => "multipart/mixed" do |p|
p.attachment :content_type => "application/octet-stream",
:body =>File.read(usuario.arquivo.path),
:filename => usuario.arquivo_file_name
end
end

end


#na view
#com o layout para os emails então a view fica bem pequena

nome <%= usuario.nome %>
email
<%= usuario.email %>
.
.
.
.


terça-feira, 17 de março de 2009

OpenSSL::SSL::SSLError (hostname was not match with the server certificate):

OpenSSL::SSL::SSLError (hostname was not match with the server certificate):

Tive essa mensagem no Rails 2.2.2 gerada pelo ActionMailer.

Parece que essa versão tenta automaticamente conectar no smtp
usando SSL, foi feito um fix porém para a versão 2.3, não disponível
na versão 2.2.2

no arquivo "config/enviroment.rb" inserir

#=======================================
if RAILS_GEM_VERSION == '2.2.2'
module ActionMailer
class Base

def perform_delivery_smtp(mail)
destinations = mail.destinations
mail.ready_to_send
sender = mail['return-path'] || mail.from

smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
smtp.enable_starttls_auto if smtp_settings[:enable_starttls_auto] && smtp.respond_to?(:enable_starttls_auto)
smtp.start(smtp_settings[:domain], smtp_settings[:user_name], smtp_settings[:password],
smtp_settings[:authentication]) do |smtp|
smtp.sendmail(mail.encoded, sender, destinations)
end
end
end
end
else
raise "you forgot to remove the ActionMailer monkey patch!"
end
#=======================================

e nas configuracoes do ActionMailer,...

adicionado o parâmetro
enable_starttls_auto
#=======================================

config.action_mailer.smtp_settings = {
:domain => 'domain.com',
:address => 'localhost',
:port => 25,
:user_name => 'user',
:password => 'passwd',
:authentication => :login,
:enable_starttls_auto => false
}

#==========================================


post_original:
http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1731-make-enable_starttls_auto-opt-in-in-actionmailer


quinta-feira, 5 de março de 2009

will_paginate ajax

Eu precisei de mudar o modo de paginação para Ajax de uma aplicação Rails que estou fazendo atualmente...
Lí em 2 blogs que ensinavam como fazer usando RemoteLinkRenderer e quando cheguei no repositório do will_paginate dei de cara com o mislav criticando essa solução, bem se o Cara, que é o CARA fala isso eu vou temar?
então segui a solução proposta

http://wiki.github.com/mislav/will_paginate/ajax-pagination

que seria algo assim:

Crie um partial com um DIV onde ficará o resultado do paginate
pra nao ficar igualzinho o do mislav mudei só os nomes....
# _resultado_busca

<% for c in @clientes %>
<%= c.nome .... blablabla %>
<% end %>
<%= will_paginate @clientes %>

No controller fica algo assim:
# clientes_controller.rb
def index
@clientes = Cliente.paginate :page => params[:page]

respond_to do |format|
format.html
format.js {
render :update do |page|
page.replace_html 'resultado', :partial => 'resultado_busca'
end
}
end
end

Depois adicionar ao application.js
# public/javascripts/application.js

document.observe("dom:loaded", function() {
// the element in which we will observe all clicks and capture
// ones originating from pagination links
var container = $(document.body)

if (container) {
var img = new Image
img.src = '/images/spinner.gif'

function createSpinner() {
new Element('img', { src: img.src, 'class': 'spinner' })
}

container.observe('click', function(e) {
var el = e.element()
if (el.match('.pagination a')) {
el.up('.pagination').insert(createSpinner())
new Ajax.Request(el.href, { method: 'get' })
e.stop()
}
})
}
})
Essa parte eu tive que fazer um pouco diferente,
porque não são em todos os lugares que eu uso
o prototype, tipo na tela inicial da aplicação... então
eu coloquei esse código no inicio do meu layout onde eu uso...


Finalmente, eu só consegui funcionar usando as versões mais novas
do prototype e de JQuery
jquery-1.3.2.js e prototype-1.6.0.2.js
e usando o script lowpro

procurei usar através deste post
http://railsontherun.com/2007/9/27/ajax-pagination-in-less-than-5-minutes

link para baixar o lowpro =>
http://svn.danwebb.net/external/lowpro/trunk/dist/lowpro.js

<%= javascript_include_tag 'lowpro' %>

só não consegui fazer o spinner.gif funcionar...
em breve se conseguir posto a solução

Marcadores