Mostrando postagens com marcador Ruby On Rails. Mostrar todas as postagens
Mostrando postagens com marcador Ruby On Rails. Mostrar todas as postagens

quarta-feira, 31 de agosto de 2011

Foreman

0



I've watched the RailsCasts #281, and Ryan Bates is talking about the Foreman gem. At the first time I did not mind for the project, this is interesting, but I don't see how it's can be useful for me. Then I go back to the project when I'm working. I open my iTerm, an tab for mongod, and tab for spork, and a tab for  guard, and another to run the generators.
After I open all this tabs, Foreman gem cames to my mind. Well, I gave to Foreman a opportunity, and I loved it.

If you think this scenario is the same of you, take a look at Foreman, and give to it a chance.
You can add the gem to your Gemfile or install it by your own hand. To work foreman only needs a file called Procfile. in this manifest file, you name your process and tell to foreman what command they should use, and above a simple Procfile for the scenario:



Very simple file, I've a process called mond, wich executes "sudo mongod" and starts the mongodb database, You'll see in the console, something like that "mongod.1 | started with pid XXX", every log from mongod will appear in the console.

To start all this process type "foreman start", Now I've only one tab running all my development processes.

Read more

segunda-feira, 29 de agosto de 2011

A Todo App written in backbone.js

0

Hey Guys,

I'm back again :)

I the weekend I write a simple app based on the Backbone.js demo the Todo App, this app is very simple, and has only one model. In my first studies I'm tried to make this todo model related to an todo list, such as the 37Signals' application Tada List, here you have a main list, and you add your tasks inside this list. But I fail with that, I can't understand Backbone itself, and I'm trying to do JQuery things and Rails Things on the backbone, and the app is not what I'm trying to do. You can checkout the source code of this fail (but working) app here: https://github.com/fellix/todo-list

Well, I forget that app, and I passed to study more about the backbone, I take a look inside the router, written the backbone-galley in a rails app, and that give me more details about the backbone. With that visions I tried to write the todo-list app again, but for now, I using Rails 3.1.rc5 and coffeescript, I have no problems with coffeescript insted of JavaScript, and I don't know why many people hates coffeescript.

After that write the app comes up http://backbone-todos.heroku.com/ and you can checkout the source code at https://github.com/fellix/backbone-todos, I'm choice the haml-js for the views, I really love haml :), for the Rails 3.1 I used that gem (https://github.com/andrewtimberlake/ruby-hamljs) for render the haml-js template, and works like magic.



Going back to the app,  the only view that was served by the rails is the home/index.html.haml, wich have only the div wich is used for render the templates, all of you can see is rendered for backbone.

That's all folks

Read more

terça-feira, 19 de julho de 2011

Backbone.JS

0

Faz muito tempo que não escrevo aqui no blog.
Ultimamente estou bem atarefado e tenho muitas coisas a escrever e publicar, porém me falta tempo para organizar as idéias e as por no blog.

Hoje vou falar de um assunto que está me tomando um certo tempo meu. Estou estudando Backbone.JS

WTF?


Backbone é um framework JavaScript para criação de Front-end RIA (Rich Internet Application), Novidade? Não.

O Que mais chamou a atenção no backbone, diante das 1239081238109238 opções que existem?

1) Suporte a Mobile.
2) Integrado com JQuery
3) Visual Clean
4) Focado em MVC
5) Usa RestFull

5 itens para ressaltar o por que do Backbone.

Desenvolvendo

O mais legal do Backbone é que ele é puro JavaScript, não existem tags geradas durante a execução, e seu CSS pode ser usado sem nenhum problema. E o principal o código gerado é o codigo escrito, usando tanto Inspect Element quanto um View Source não vão mostrar um código absurdo que somente seu navegador consegue ler. Nunca fui muito fã de aplicações RIA, justamente por que elas dificultam essa parte de inspeção dos elementos e foi justamente isso que me chamou a atenção no backbone.

Basicamente o Backbone é composto por Events, Models, Collections, Routers e Views. 

Event: É um modulo que pode ser anexado em outros objetos. Ele é simplesmente composto dos metodos bind, unbind e trigger.

Model: É o núcleo da sua aplicação com Backbone, é nele que ficam as lógicas de persistencia, validação, e algum trabalho com a tela. Um model pode ser qualquer coisa, assim como no Rails seu model não precisa, necessariamente estar ligado a um base de dados. Um exemplo de um Model


O uso do window é usado somente para definir esse objeto como global para poder usar por exemplo new Album. Essa é uma das maiores classes do Backbone, vale a pena dar uma olhada na documentação

Collection: Não são nada mais do que uma coleção de modelos. Para definir é necessário passar o model que representa essa collection e também um URL que será usada para buscar e preencher a listagem.


Esse é outro objeto simples do backbone :)

Router: Router é responsavel por gerenciar as urls do backbone. e saber para qual callback redirecionar. as urls do backbone começam com um # ex: (#users/felix). Nem toda a aplicação precisa de um Router, mas se sua aplicação precisar de uma complexidade maior vai precisar sim :)

PS: Na versão 0.3 do backbone ele era chamado de Controller.
Reparem que na definição da rota eu não preciso definir o # antes da url, mas para executa-la nas views o link deve ser #collection/1/album/1 reparem que substitui os wildcards (:album_collection_id e :id) pelos ids que vou trabalhar, esse link com o # dispara o router do backbone que já deve ser previamente inicializado (new), e deve existir uma (uma e somente uma),chamada ao metodo Backbone.history.start() dessa forma o backbone inicia a leitura das URL.

View: Uma view para o backbone é algo renderizado na tela, baseado em tags, vc pode renderizar suas telas usando JavaScript, cada view é responsavel por gerenciar seus eventos. Existem um atributo chamado events, onde os eventos podem ser definidos como por exemplo para submter o form da propria view você teria uma sintaxe parecida com essa "submit form": "save", onde submit é o evento, form é selector do JQuery, e save é o callback que será executado quando o form for submetido. Simples não?

Exemplos

Sem mais o que falar vou por alguns links aqui.


Essa foi a aplicação base para fazer alguns estudos e me ajudou bastante a entender alguns conceitos sobre o backbone.

Reescrevi a mesma aplicação usando o Rails 3.1:

Na wiki do Backbone tem muito mais exemplos não deixem de conferir, existe até um exemplo de Mobile :)

Read more

domingo, 9 de janeiro de 2011

RSpec+Mongo+DatabaseCleaner

0

Em portugues

Some times ago, I wrote about RSpec and MongoDB I was used the DatabaseCleaner 0.5.2, the version 0.6.0 was released some times ago, and I not tested it before, the changes are simple, the main change is the orm options need to be before the stategy option, see below the spec_helper.rb:


RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.orm = :mongoid
    DatabaseCleaner.strategy = :truncation    
    DatabaseCleaner.clean_with(:truncation)
  end  
  config.before(:each) do  
    DatabaseCleaner.start
  end
  config.after(:each) do  
    DatabaseCleaner.clean
  end
end

Also changed the before option, now it's initialize the Cleaner, and the after option, clean the database

Read more

RSpec+Mongo+DatabaseCleaner

0

A algum tempo atrás escrevi sobre RSpec e MongoDB a versão que usei o database cleaner na época era a 0.5.2, a algum tempo atraz saiu a versão 0.6.0, e eu ainda não havia testado, bom as alterações são simples, a principal é que o orm deve vir primeiro, veja abaixo como ficaria o spec_helper.rb

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.orm = :mongoid
    DatabaseCleaner.strategy = :truncation    
    DatabaseCleaner.clean_with(:truncation)
  end  
  config.before(:each) do  
    DatabaseCleaner.start
  end
  config.after(:each) do  
    DatabaseCleaner.clean
  end
end

também foi alterado para o before, iniciar o Cleaner, e o after para limpar. :D

Read more

terça-feira, 28 de dezembro de 2010

Ruby on Rails + JasperReports (IReport)

0

Atualmente aqui na Serhmática, usávamos um sistema interno, uma aplicação "Cobaia" feita em Swing para gerencia de projetos, estávamos a algum tempo estudando o desenvolvimento de uma nova ferramenta WEB, onde nossos clientes pudessem acessar, diminuindo o fluxo de email, e tornando o contato com o cliente mais transparente. Como estamos com muito tempo de sobra, não conseguimos progredir com a aplicação, e procuramos uma solução que pudesse nos atender, eis que encontramos o Redmine, uma aplicação escrita em Ruby on Rails, nossa intenção inicial, era rodar no Glassfish que já tinhamos configurado, porém houve inconsistências, BUGS não explicados pela internet, e partimos a rodar via Mongrel mesmo.

Testamos e gostamos da ferramenta, ainda não está pública para os clientes, mas aos poucos vamos liberando, surgiu um outro problema, precisávamos de alguns relatórios no nosso estilo, que pudesse ser encaminhado aos clientes, a primeira coisa que pensei foi FODEU.


Pesquisei na net e cheguei até um blog brazuca, que tinha um projeto parecido com o que eu queria, testei os códigos desse cara, infelizmente ele não lista os jars que vc precisa, mas vou listar aqui:

  • commons-beanutils
  • commons-collections
  • commons-digester
  • commons-logging
  • commons-logging-api
  • iText
  • jasperreports
  • postgresql


 e tive o primeiro sucesso, e veio o primeiro problema, precisava parametrizar as buscas, não como no modelo do cara, dai resolvi fazer diferente:

1) Criar no relatorio_controller uma action e mapeei ela no routes.rb
2) Criei a tela com form_tag e adicionei os parametros
3) no retorno da action fiz a busca e mandei pro relatório.

Eis que vem o primeiro erro, o JasperReports não conseguiu processar o modelo do Ruby.
Matutei uma solução e encontrei, criei um projeto bem simples, coloquei uma classe la dentro, e adicionei os campos, no IReport criei o relatório com base naqueles campos. A classe ficou mais ou menos como a classe abaixo:

public class Relatorio{
  private Integer issue_id;
  private String issue_subject;
  private String issue_description;
}
criei assim mesmo fora do padrão com os underlines (_) para ser mais facil pro ruby reconhecer.
depois da busca efetuada, percorri o resultado e fui criando novos objetos desse relatorio, passei esse objeto para o model Relatorio e no final converti o Ruby Array em um ArrayList e depois em um JRBeanCollection

@dataSource = JRBeanCollectionDataSource.new(ArrayList.new(dados))

editei tbm o metodo to_pdf e ficou assim:
def to_pdf
    fill = JasperFillManager.fill_report(@modelo, @params, @dataSource)
    pdf = JasperExportManager.export_report_to_pdf(fill)
    return String.from_java_bytes(pdf)
end

e pronto, agora estou com o Redmine rodando no mongrel e gerando relatório em PDF com o JasperReports.

Em tempo: Criei um jasper.rb na pasta config/initializers, ele carrega as libs ao invés de deixar no model.

Tbm alterei os observers e os fiz rodar em um Thread a demora do servidor de email pra responder causava lentidão no sistema, por exemplo o MessageOberver

class MessageObserver < ActiveRecord::Observer
  def after_create(message)
    t = java.lang.Thread.new do
      Mailer.deliver_message_posted(message) if Setting.notified_events.include
    end
    t.start
  end
end

Espero que isso seja util pra mais alguém, qualquer dúvida comenta ai que vejo se posso ajudar.

Read more

quarta-feira, 8 de dezembro de 2010

Modelos sem tabelas no rails

0

Bah, esse me surgiu esses tempos, e resolvi fazer alguns testes, eu armazeno um objeto em uma sessão com o rails, mas eu não tinha intenção de armazenar essa bagaça na base, somente em memória. sem ideias fui eu pela internet buscar como fazer isso. O Rails 3 modularizou boa parte do rails, um refactoring grande, mas que facilitou muita coisa, como o teste abaixo, por exemplo:

class Person
  attr_accessor :name, :age
end

Ta tio, e se quiser usar as validações e outras coisas do rails? vou ter que fazer tudo no braço? Bom é claro que não né, que puta perca de tempo isso. Veja a adaptação abaixo:

class Person
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :age
  validates :name, :age, :presence => true

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end  
  
  def persisted?
    false
  end
end

vejam só que maravilha, agora vc pode fazer coisas como essas (irb):

p = Person.new
=> #
p.valid?
=> false
p.errors
=> #["translation missing: br, activemodel, errors, models, person, attributes, age, blank"], :name=>["translation missing: br, activemodel, errors, models, person, attributes, name, blank"]}>

Ooops, falta as traduções, mas isso é dever de casa né ashudahushud.

Read more

terça-feira, 9 de novembro de 2010

Haml+Rails

2

Haml é uma linguagem de marcação, para renderizar templates HTML, baseada em tags e identação. Sempre gostei muito de usar o HAML nas minhas aplicações Rails 2, pela simplicidade e facilidade na criação. Você se acostuma a identar ao invés de procurar aonde a tag deve ser fechada. O Rails 3 foi modularizado para facilitar a customização. Porém a gem haml, responsável por renderizar os arquivos HAML, não possui generators embutidos para o Rails, procurando na internet encontrei o projeto rails3_haml_scaffold_generator que faz exatamente isso, mas vc precisa executar alguns passos, e eu odeio coisas repetitivas, a primeira coisa que pensei foi procurar se havia alguma gem parecida, e não encontrei.

Resolvi arregaçar as mangas, e fiz minha primeira gem, no caso eu simplesmente movi para o diretório os arquivos como se fossem um gem, e ajustei os diretórios com a ajuda do Jeweller.

O uso dessa gem é bem simples, ela nem tem reação com a gem haml, pois ela consiste somente nos generators.

Adicione ao seu Gemfile as seguintes linhas

gem haml
gem haml_rails

use o bundle install ou uso o gem install para instala-las.

depois só executar o comando

rails g haml_rails:install

ele vai editar seu application.rb e adicionar o haml como seu template engine. vc pode apagar caso prefira usar o ERB.

Por enquanto é isso..

Read more

domingo, 17 de outubro de 2010

Rails 3, RSpec 2, Devise a MongoDB

1

Estive estudando o Rails 3 (Atualmente 3.0.1 para o rails), e também estudando um pouco de NoSQL, com o MongoDB, ainda pretendo me dedicar um pouco para aprender sobre o Redis, mas por enquanto estou vendo o Rails. Gosto de usar para autenticação o Devise, um projeto brasileiro, que se tornou bem famoso pelo mundo Rails. Para ORM gostei do Mongoid, e ainda mais pelo devise ter suporte ao mongoid ao invez do ActiveRecord.

Iniciando

Sobre o mongoid não há muito o que falar, a documentação presente no site é completa, e funciona muito bem, vale lembrar que arquitetura de um banco relacional é bem diferente de um NoSQL, e algumas definições já padrão na nossa cabeça devem ser desfeitas.

O RSpec-Rails vem configurado para rodar sobre o ActiveRecord e quando vc executar um rails g rspec:install ira gerar toda a estrutura padrão do rspec, incluindo a pasta spec que contem os testes. Primeiramente vamos editar o arquivo spec/spec_helper.rb

RSpec.configure do |config|
  require 'database_cleaner'
  
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.orm = "mongoid"
  end

  config.before(:each) do
    DatabaseCleaner.clean
  end
  config.mock_with :rspec
  config.include Devise::TestHelpers, :type => :controller # Essa linha adiciona os helpers do Devise para o RSpec.
end

A adição da gem DatabaseCleaner (que deve estar declarada no Gemfile), serve para limpar os resultados dos testes apos a execução, como podem reparar o uso de fixtures é desabilidado para o Mongo, somente para o ActiveRecord, sem o uso de fixtures os testes são mantidos na base, o que não é interessante.

Testando os controllers

Criei um modelo simples com o devise, apesar da documentação do devise indicar a criação de um modelo Admin para esses casos, preferia adotar o uso de um flag para poder indicar se o usuário é um administrador, acho isso um tanto mais simples.
Adicionei também no application_controller.rb um metodo filtro que indica se o usuário é um adminsitrador

protected
  def admin_user!    
    if authenticate_user!      
      unless current_user.admin        
        flash[:warning] = "Acesso Negado"
        redirect_to root_url
      end
    end
  end
reparem que usei o filtro authenticated_user! que é do devise pra indicar que o usuário está logado no sistema.
meu controller admin_controller.rb
class AdminController < ApplicationController
  before_filter :admin_user!
  
  def index
  end

end
é um controller bem simples, mas para garantirmos a segurança do aplicativo, e se algum dia nosso filtro precisar ser ajustado precisamos garantir que o acesso a esse controller seja restrito sempre, e quem alterar deve ter noção da quebra do teste. Em alguns dos meus testes, normalmente em fixtures, eu pego um hash que representa o codigo BCrypt da senha (padrão do Devise), mas como aqui no mongo não tem fixutes, parti pra outro ponto.
require 'spec_helper'

describe AdminController do
    
  describe "GET 'index'" do    
    def do_action_with_user(admin)
      @user = User.create!(:name => "Test", :email => "test@test.com", 
        :password => "testet",
        :password_confirmation => "testet",
        :admin => admin)        
      sign_in @user
      get 'index'
    end
    #1
    it "should not be successful when no user was logged in" do
      get 'index'
      flash[:alert].should_not be_nil
      response.should_not be_success
    end
    #2
    it "should not be successful when no admin user was logged in" do
      do_action_with_user(false)      
      flash[:warning].should_not be_nil      
      response.should_not be_success
    end
    #3
    it "should be successful when admin user was logged in" do
      do_action_with_user(true)
      response.should be_success
    end
  end

end
bem simples, um metodo dry pra fazer o registro do usuario e usar o metodo auxiliar do devise para o login (sign_in):
  • o teste 1 é um teste para acesso sem login, no caso uma chamada a action index do controller admin sem um usuário logado.
  • teste 2 teste para um usuário que não é administrador, repare que testo se o flash esta preenchido
  • teste 3 testa a ação de sucesso, no caso o acesso de um usuário administrador
Inicialmente esse teste se fez suficiente para dizer que agora a classe está segura.

Outras notas

Tive alguns problemas no começo do uso do RSpec 2 em views, e vou listar aqui alguns deles:

assign :name, "Teste"
ao invez de
assigns[:name] = "Teste"
Outra mudança é que em views você não deve mais usar o response, mas usar o rendered. Também deixou de existir o metodo have_tag, para verificar o conteudo de uma tag, veja abaixo:
#RSpec 3
assert_select('p', "Teste")
#RSpec 2
response.have_tag 'p', "Teste"


Espero que isso seja util pra mais alguem, pelo menos eu não vou mais esquecer :D

Read more

segunda-feira, 30 de agosto de 2010

Rails 3 is out

0

Não deu nem tempo de postar sobre meus testes com o Rails 3 RC e a versão final está disponivel :)

http://akitaonrails.com/2010/08/29/rails-3-0-final-acaba-de-ser-lancado

Read more

segunda-feira, 22 de março de 2010

RJS X Alert Com quebra de linha

0

Mais uma poderosa batalha a ser travada, ahauhhuauha, estou cá eu com meus botões estudando rails, e resolvo por na mensagem de alert de erro os erros que ocorreram quando o objeto foi salvo meu snipet do rjs é algo semelhante a isso (Rails 2.3.4 e JQuery)

update.rjs

if flash[:error]
page << "alert('#{flash[:error]}')"



Quando no controller havia uma única mensagem (Erro ao atualizar dados), esse snipet funcionava muito bem, muitos vão dizer que é mais facil usar so page.alert, sim é mais facil, enfim, o código tava assim e pronto ;)

Qual a solução encontrata para mostrar os erros? Bom percorrer o array de erros e mostrar cada um em uma linha não é? Coisa facil fui lá eu

controller.rb

def update
#Preenche o objeto
if @objeto.save
#Não interessa
else
msg = "Erro ao atualizar dados \n"
@objeto.errors.full_messages.each do |error|
msg += "#{error.to_s}\n"
end
flash[:error] = msg
respond_to
end


Muito simples né, e adivinha que me apareceu no alert?

"Erro ao atualizar dados \n Data não pode ser vazio\n"

sim os "\n" apareceram no alert se mudar para o
aparece no meio o
, eu tava quase querendo joga pela janela o PC, eis que eu resolvo recorrer ao nosso grande oraculo e encontrei um post de um caboclo falando a solução, pois ele passou por esse mesmo problema, e se vcs olharem o post do blog foi la em 2007 :(, só fazem 3 anos ahauuhauhah, resumindo, o que deve ser feito é criar um metodo na classe helper

helper.rb

def get_alert_error_message
msg = "Erro ao atualizar dados \n"
@objeto.errors.full_messages.each do |error|
msg += "#{error.to_s}\n"
end
return msg
end


Reparem o código é exatamente igual


update.rjs

if @error
page.alert "#{get_alert_error_message}"
end


E acreditem, exatamente o mesmo código, funcionou da forma que eu queria :), pra quem não consegue imaginar, a variavel @error foi criada para indicar quando ocorreu um erro no RJS, para imprimir esse alerta só se ocorreu um erro.

PS: Esse post além de compartilhar essa informação, é pra eu me lembrar futuramente disso ai.

Read more

segunda-feira, 19 de outubro de 2009

Um poco de RSpec

8

Estou focando um pouco dos meus estudos em RSpec e BDD, e é incrivel como existe pouco material em portugues sobre o RSpec, então, esse é um post rapido explicando como se validar algumas propriedades dos seus modelos no Rails usando RSpec.

PS: Estou utilizando I18n do Rails para a versão que eu traduzi do rails. seus erros podem estar na versão não traduzida, então o ideal é cuidar, pois seus testes podem não passar.

Validação um campo que deve ser informado.


#Imagine que User é uma classe de usuário qualquer
describe User do
it "should be have an login" do
@user = User.new
@user.save
@user.errors.on(:login).should be_eql("não pode ser em branco")#substitua essa string por seu texto customizado ou pela mensagem padrão em inglês
end
end


Esse codigo simula a gravação de uma entidade, e verifica se existe o erro. lembrando que você deve adicionar na classe user:

class User < ActiveRecord::Base
validates_presence_of :login
end


validando um número

#classe user.rb
validates_numericality_of :age, :only_integer => true
#user_spec.rb
it "should be have a valid number for age" do
@user.age = "a"
@user.save
@user.errors.on(:age).should be_eql("não é um número")
end


Validanto tamanho de um campo

it "should be invalid when the name is greater than 100" do
@user.name = "a"*101
@user.save
@user.errors.on(:name).should be_eql("é muito grande (máximo é 100 caracteres)")
end
#user.rb
validates_length_of :name, :maximum => 100


3 validações básicas para quem ta começando a mexer com o RSpec, não é lá grandes coisas, mas pode ajudar iniciantes em RoR a praticar o BDD.

[]'s

Read more

terça-feira, 29 de setembro de 2009

Rails - Editando o CSS do seu formário uma unica vez

1

Acredito que todo o desenvolvedor tenha alguns problemas com CSS, ou de esquecer um maldito campo, e ele ficar sem o layout, muitas vezes, todos os campos são renderizados de maneira diferente, de acordo com a definição do designer, ou da equipe.
Normalmente o saco, é por exemplo em rails criar um form da seguinte maneira

- form_for(@foo) do |f|
%p= f.error_messages
%table
%tr
%td= f.label 'Nome:'
%td= f.text_field :name, :class => :atext_field
%tr
%td= f.label 'Descrição:'
%td= f.text_area :description, :class => :atext_area
%tr
%td= f.submit 'Salvar'

PS: Esse código foi escrito em HAML. é bem simples modifica-lo para ERB.
O que vemos é que existem dois campos com a tag :class, que indica a classe do componente para o Rails renderizar na tela. Eis que nessa tela imagine mais uns 10 text_field, e outras páginas de cadastro com quantidades semelhantes de campos. Ai o desgraçado do design resolve mudar o layout (não me levem a mal designer, muitas vezes vocês nos dão raiva mesmo, :D), e para mander compatibilidade ele cria outras tags, e la veio no minimo meio dia de serviço para ajustar esses campos ai para o nova classe (por ex: btext_field).

Mas vamos relembrar um conceito simples do Ruby as classes abertas. Nessa situação é um modulo (module), que gerencia os forms, o querido ActionView::Helpers::FormTagHelper.
Ele é o responsavel por renderizar esses objetos. agora basta simplesmente você alterar esse modulo, veja como fazer (editei no meu environment.rb, como ele não é recarregado tem que para o servidor e iniciar novamente, vocês podem fazer esse código em qualquer lugar)

module ActionView
module Helpers
module FormTagHelper
def text_field(object_name, method, options={})
super object_name, method, options.merge(:class => :btext_field)
end
def text_area(object_name, method, options={})
super object_name, method, options.merge(:class => :btext_area)
end
def check_box(object_name, method, options={}, checked_value="1", unchecked_value = "0")
super object_name, method, options.merge(:class => :bcheck_box), checked_value, unchecked_value
end
end
end
end

Caso não conheça o metodo merge dos hash do ruby, seria interessante conhece-lo, dessa maneira, não existe mais a necessidade de definir o atributo :class em cada text_field, essa alteração coloca automáticamente essa informação disponivel. Existem coisa que o ruby faz que surpreendem :D.

Read more

sexta-feira, 23 de janeiro de 2009

Testando Seu Código Java com Ruby

1

Galera essa foi muito boa, eu procurando sobre usar o BDD em Java, algo parecido com o RSpec, que gosto tanto, e me familiarizei fácil usando no Rails. Achei um que pareceu interessante o JBehave, porém parecia mais com os Stories do RSpec, é não com os Spec, que era justamente o que eu queria, também encontrei um tal de JDave, mas ainda é um projeto embrionário, e resolvi procurar se havia uma versão do RSpec para Java, eis que caio no Blog do Ola Bini, um dos Team Leaders do JRuby, e ele mostra usando o RSpec com Java usando JRuby. Não era bem isso que queria, mas mesmo assim, resolvi experimentar, nunca mexi muito com o JRuby, já brinquei com Java e Ruby separados mas não nessa versão, usando recurso das duas linguagens juntas. Então lá fui eu copiar o exemplo do Ola Bini, e para minha surpresa funcionou muito bem, melhor do que eu esperava. Então pequei um código e comecei a testar para ver se funcionava com minhas entidades, testar um programa escrito em puro Java, em outras palavras usar as classes do Projeto e as do Ruby juntas.

Então comecei a luta para o JRuby reconhecer minhas classes, e após algumas tentativas frustradas, que incluíam adicionar o jar do Projeto no classpath, não funcionou. Estava pronto para estudar o JDave ou o JBehave, quando recorri ao senhor supremo da internet, o Google. Encontrei uma wiki sobre JRuby, e lá tinha um código relativamente ridículo, que eles diziam que adicionava a biblioteca ao JRuby. Vejam o código simples:


require "caminho/para/arquivo.jar"
module Models
include_package "pacote/suppacote"
end


Um Module em ruby, é quase uma classe, ele é um complemento para uma classe, todo o código de um module incorporado a uma classe pode ser usado, sem restrição (ou talvez haja e eu não sei, não estudei muito essa parte.). Esse module só vai simplificar nosso trabalho, ao invés de fazer a chamada usando o padrão do JRuby que é de:


pacote.subpacote.Classe


Chamamos direto pelo estilo Ruby de Models::Classe, pode parecer poca coisa mais se você for seguir as convenções da Sun da um caminho grande até a classe.

Agora sim podemos criar nossos testes com o JRuby usando projetos Java. Vocês podem ver o exemplo do Ola Bini, e testar suas classe com o RSpec, caso não saiba ainda utilizar o RSpec, é uma chance de aprender. Para você usar na sua classe de Teste, tem que adicionar também no início do arquivo o require do seu module como, por exemplo:


require "caminho/para/models.rb"


Assim você pode usar qualquer classe do seu Projeto.jar sem problemas e testa-las usando RSpec. Pra que sofrer com JUnit?

Logo logo sai um artigo sobre MVC em PHP a pedido do meu amigo Renato, aguardem.

[]'s

Read more

sexta-feira, 26 de dezembro de 2008

Rails e Merb

0

Essa guerra começou a pouco tempo e já terminou, e pra mim isso não é um bom sinal. Como alguns que participam da comunidade de Ruby, sabem que o Merb é outro framework para desenvolvimento web, eu ainda não tive tempo de brincar com ele, e gostaria de tirar um tempo logo para ver seu funcionamento. Porém ao chegar hoje de manhã, me deparo com a principal noticia da comunidade, o fim da guerra de Rails X Merb, a união das duas equipes para criar um só framework.

Porém ao meu ver isso não é uma boa coisa, a Guerra fria entre esses dois frameworks poderia trazer muito mais recursos e evolução para a comunidade Ruby, com essa união, finda-se a guerra, e o Rails continua absoluto. Não a concorrentes ou alguem com quem disputar espaço, então pra que correr? Pra que melhorar de forma desenfreada? Acredito que se essa fusão esperasse mais teríamos frameworks bem melhores,e quem sabe uma opção diferente ao Rails. Muita gente pode me criticar por essa opnião, não estou dizendo que a fusão é ruim, mas poderia levar mais algum tempo. A guerra fria entre EUA X URSS, trouxe toda a evolução que temos hoje, foi um grande passo para a humanidade, e acredito que se a guerra do Ruby para Web continuasse quem sabe os frameworks não melhorariam bem mais.

Detalhes

Read more

quinta-feira, 20 de novembro de 2008

Spree-pagseguro-carrinho-proprio Atualizado

0

Adicionei algumas alterações no spree-pagseguro-carrinho-proprio no Github, lembrando que esse é um projeto para Ruby on Rails, mas precisamente uma extensão a um projeto Open Source o Spree.

O Spree é um projeto de e-commerce para Ruby on Rails, pode servir como base para qualquer aplicação, porém ele possuia somente vinculos com meios de pagamento internacional, e surgiu a ideia de criar um extension para o Spree utilizando algum meio de pagamento brasileiro, como é o caso dessa, ela utiliza o carrinho do Spree para se vincular com o Pagseguro.

Nesse commit adicionei o RSpec de teste da view que altera para fazer o vinculo, para utilizar você so precisa cadastrar algum e-mail seu no pagseguro e adicionar no codigo fonte da extension, prometo em breve melhorar isso, colocar quem sabe em um YAML, vou pensar sobre isso para facilitar mais, voltando a falar do commit também fiz algumas alteraçõe spara seguir as convensões do Spree de extension.

Para mais detalhes acessem o site do Spree
E vejam o projeto no meu GitHub

Se quiserem dar uma olhada, ou sujestões fiquem a vontade

-----------------------------------------------------------------------------------------------

Aproveitando esse post vou falar um pouco sobre minha aventura com o RSpec.

Eu como desenvolvedor Java nunca fui fã de usar testes, em Java debugamos, apesar de existirem ferramentas boas para criar testes, não é muito comum criar suites de testes.

Então começei a participar do Spree, com essa ideia de integração com o Pagseguro, ai fiquei sabendo que teria que criar testes RSpec para o projeto pois um projeto Rails sem testes não é bem visto. Então la fui eu pesquisar sobre o RSpec, e uma coisa me chamou a atenção, o RSpec é muito famoso na comunidade, e muito utilizado, porém ele é muito mal documentado, ou eu que não vi direito, porém você quase não ve exemplos no site.
Ainda bem que existem screencasts, o nofxx tem uma que introduz ao RSpec, que foi muito util, aprendi como funciona o RSpec, pois estava complicado de entender.
Passei a fazer alguns teste, e pronto, já sentia que estava dominando o RSpec, grande ilusão.
Nessa extension para Spree, eu so tenho que testar uma view, uma única view, qual será a diferença. Pois é, me ferrei. E realmente não tava evoluindo os testes, não conseguia rodar, davam erros em objetos da view, e por mais que eu criasse mock eles continuavam, só depois que percebi que faltavam os helpers do Spree, então adicionei os que são utilizados na view, e novamente mas problemas com models, porém dinha um erro que eu tinha concertado, errrr digamos com gambiarra;
A view dava um erro pois o Spree usa o Resource_Controller, e ele dizia que o metodo ou variavel object_url é indefinido, então eu muito esperto escrevi um metodo para solucionar isso, e o erro passou, mas um teste não pode fazer isso não é, então recorri ao Google Groups do rails-br, e lá demorou um pouco mais me falar de um tal de scaffold_resource que gera os testes do RSpec, pra mim dar uma olhada, e realmente foi uma linha de código para solucionar isso:

  1. template.should_receive(:object_url).twice.and_return(order_path(@order))


E pronto o erro foi resolvido, depois outro erro, dessa vez recorri ao rubyonbr.org, e o nofxx me respondeu, esse erro era meio estranho


Mas na verdade o que me deixou assustado foi a falta de aplicações exemplos no site do RSpec, que ajudariam muito quem esta começando, ainda tenho que fazer muitos testes pra pegar bem o RSpec, mas vamos assim como esta.

[]'s

Read more

 
Design by ThemeShift | Bloggerized by Lasantha - Free Blogger Templates | Best Web Hosting