Posts Tagged ‘model’

Ruby on Rails usando strip_tags nos controllers, models e libs

Postado em 15 jun 2009
Categoria(s) Ruby on Rails

O Ruby on Rails possui o métogo strip_tags para remover tags html. Esse método está apenas disponível na camada de view, uma vez que faz parte ActionView::Helpers::SanitizeHelper.

Eu não concordo com essa implementação do Rails, acho que deveria ser disponível também na camada de controller e model, onde são os lugares que esse método é mais útil.

Para implementar o strip_tags nos controllers, models e libs, nós podemos adicionar esse método na classe String, desta forma estará disponível em qualquer lugar.

Abra o arquivo config/initializers/new_rails_defaults.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Be sure to restart your server when you modify this file.
 
# These settings change the behavior of Rails 2 apps and will be defaults
# for Rails 3. You can remove this initializer when Rails 3 is released.
 
if defined?(ActiveRecord)
  # Include Active Record class name as root for JSON serialized output.
  ActiveRecord::Base.include_root_in_json = true
 
  # Store the full class name (including module namespace) in STI type column.
  ActiveRecord::Base.store_full_sti_class = true
end
 
# Use ISO 8601 format for JSON serialized times and dates.
ActiveSupport.use_standard_json_time_format = true
 
# Don't escape HTML entities in JSON, leave that for the #json_escape helper.
# if you're including raw json in an HTML page.
ActiveSupport.escape_html_entities_in_json = false

Adicione no final do arquivo as linhas:

1
2
3
4
5
class String
  def strip_tags
    ActionController::Base.helpers.strip_tags(self)
  end
end

As linhas acima criam o método strip_tags na classe String.

Ficando o arquivo completo assim:

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
# Be sure to restart your server when you modify this file.
 
# These settings change the behavior of Rails 2 apps and will be defaults
# for Rails 3. You can remove this initializer when Rails 3 is released.
 
if defined?(ActiveRecord)
  # Include Active Record class name as root for JSON serialized output.
  ActiveRecord::Base.include_root_in_json = true
 
  # Store the full class name (including module namespace) in STI type column.
  ActiveRecord::Base.store_full_sti_class = true
end
 
# Use ISO 8601 format for JSON serialized times and dates.
ActiveSupport.use_standard_json_time_format = true
 
# Don't escape HTML entities in JSON, leave that for the #json_escape helper.
# if you're including raw json in an HTML page.
ActiveSupport.escape_html_entities_in_json = false
 
class String
  def strip_tags
    ActionController::Base.helpers.strip_tags(self)
  end
end

Agora reinicie o seu servidor web para pegar essas novas configurações na inicialização da aplicação.

Agora quando você precisar do strip_tags pode usar assim, exemplos:

params['title'] = params['title'].strip_tags
 
ou
 
>> '<b>meu texto</b>'.strip_tags
=> "meu texto"

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Ruby on Rails ActiveRecord como excluir registros dependentes e arquivos anexados com o Paperclip

Postado em 10 jun 2009
Categoria(s) Ruby on Rails

Digamos que você tenha uma mensagem, e essa mensagem possa ter várias fotos e vídeos relacionadas com ela.

Com o model message.rb da forma abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Message < ActiveRecord::Base
  # associações
  belongs_to :user
  has_many :photos
  has_many :videos
 
  # validações
  # presença
  validates_presence_of :title
  validates_presence_of :content
 
  # tamanho máximo
  validates_length_of :title, :maximum => 255
end

Se você usar Paperclip para anexar as fotos e vídeos, quando você apagar uma mensagem os arquivos de fotos e vídeos iram continuar a existir no disco rígido.

Para forçar que todas as relações filhas sejam apagadas quando você excluir a mensagem, você deve adicionar :dependent => :destroy na declaração has_many, ficando assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Message < ActiveRecord::Base
  # associações
  belongs_to :user
  has_many :photos, :dependent => :destroy
  has_many :videos, :dependent => :destroy
 
  # validações
  # presença
  validates_presence_of :title
  validates_presence_of :content
 
  # tamanho máximo
  validates_length_of :title, :maximum => 255
end

Essa alteração força para que todos os dependentes sejam excluídos.

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Usando o Vim para Programar em Ruby on Rails

Postado em 21 abr 2009
Categoria(s) Ruby on Rails

Como todas as pessoas que procuram desenvolver com qualidade e agilidade, eu tive a minha saga até encontrar uma boa ferramenta de edição de código.

Eu só trabalho usando Linux, com certeza ele é o sistema operacional mais produtivo para trabalhar com desenvolvimento em tecnologias livres, para programar em PHP, Ruby on Rails, Java, Python e outras é uma maravilha. A quantidade de softwares e coisas legais é imensa.

Nessa minha saga e evolução no mundo dos editores/IDE já usei Dreamweaver, Gedit, Geany, Eclipse, Aptana, Komodo, Bluefish e por último o NetBeans. Sempre tinha alguns detalhes neles que acabava me irritando, algo que eles não conseguiam fazer. Alguns tinham tantos recursos que acabavam sendo pesados demais. Por último eu estava usando o NetBeans, ele tem umas sacadas legais e algumas coisas divertidas, mas é absurdamente pesado, outro detalhe é que algumas IDE’s tem a mania descontrolada de querer fazer tudo através de interface gráfica, trilhões de janelas para fazer coisas super simples, o terminal é um lance necessário em uma IDE, muitas coisas podem ser feitas em secundos através de um shell. Não a nada de errado em usar o shell, graças a ele que a produtividade aumenta muito, quem acha que interface gráfica aumenta a produtividade está enganado, as vezes ela só enrola mais as coisas.

Através de toda essa saga acima eu acabei chegando no VIM, usando especificamente o Gvim no Gnome para desenvolver em Ruby on Rails. Até o presente momento só são ótimas opiniões formadas sobre ele.

Nesse post vou mostrar como ganhar mais produtividade usando o Gvim.

Todos os passos abaixo foram feitos no Ubuntu 8.04, por que no Ubuntu? Porque ele é simples, tem uma porção de distribuições Linux por ae que complicam demais as coisas, o Ubuntu é sucesso porque é simples de usar. Existe uma grande chance de coisas simples fazerem mais sucesso que as coisas complicadas. :-)

Instalação do Gvim

1
sudo apt-get install vim vim-gnome vim-addon-manager vim-common vim-full vim-gtk vim-gui-common vim-rails vim-ruby vim-runtime vim-tiny exuberant-ctags ncurses-term

Instalação do Git

1
sudo apt-get install git

Instalação da gem para busca de arquivos

Essa gem está no github, desta forma é necessário adicionar o seu repositório: gem sources -a http://gems.github.com

1
sudo gem install jamis-fuzzy_file_finder

Instalação do pacote de configurações para o vim

Agora vamos instalar um pacote de configurações prontas para o vim, esse pacote foi criado pelo Fabio Akita, esse pacote já tem uma série de plugins, temas e snippets.

1
git clone git://github.com/akitaonrails/vimfiles.git ~/.vim

Você precisa criar o arquivo ~/.vimrc e adicionar o conteúdo abaixo:

1
2
3
4
5
6
7
source ~/.vim/vimrc
 
colorscheme vibrantink
set nu
set sts=2
set sw=2
let g:fuzzy_ignore = "gems/*"

Essas configurações irão fazer o número de linhas aparecer, ignorar os diretórios de gems e outros ajustes.

Os snippets estão em um repositório separado, desta forma precisamos obter esses arquivos, faça os passos abaixo:

1
2
3
cd ~/.vim
git submodule init
git submodule update

Existe um outro ajuste que pode ser feito, mas esse é opcional, da forma como está agora sempre irá aparecer um $ no final de cada linha, para marcar o fim, particularmente eu não gosto disso. Se você quiser é possível retirar essa marcação, edite o arquivo ~/.vim/vimrc procure pelas linhas:

1
2
"display tabs and trailing spaces
set list

E deixe a configuração set list comentada, desta forma:

1
2
"display tabs and trailing spaces
"set list

Feito isso nós já temos uma nova gama de funcionalidades adicionadas ao vim, mas é possível melhorar mais ainda, vamos agora instalar a fonte Monaco usada no TextMate. Essa fonte deixa o código com um visual legal.

Instalação da fonte Monaco

1
2
3
4
5
6
7
8
cd /usr/share/fonts/truetype
sudo mkdir myfonts
cd myfonts
sudo wget http://www.gringod.com/wp-upload/software/Fonts/Monaco_Linux.ttf
sudo chown root.root *.ttf
sudo mkfontdir
cd ..
fc-cache

Agora se você digitar no terminal:

1
gvim

Vai ver o gvim com a fonte Monaco e o tema desert.

Gvim

Com o gvim aberto vamos criar um projeto em Ruby on Rails, e ver as funcionalidades novas que temos no vim. Graças ao plugin rails.vim (http://rails.vim.tpope.net/) foram adicionadas uma série de features.

Criando um projeto Ruby on Rails

Digite no gvim:

1
tecla esc + :Rails autocomplete

Onde autocomplete é o nome da minha aplicação Ruby on Rails nesse exemplo.

A opção irá criar a aplicação com suporte ao banco de dados SQLite, se você quiser suporte ao outro banco de dados digite:

1
2
3
4
tecla esc + :Rails autocomplete -d mysql
ou
tecla esc + :Rails autocomplete -d postgresql
...

Esse comando irá criar uma aplicação Ruby on Rails nova.

Nova Aplicação

Pressione a tecla enter como informado na mensagem.

O plugin rails.vim é bem esperto, ele já vai abrir para você o database.yml para você configurar o banco de dados:

Database

Pressione a tecla i ou insert para editar os dados, faça as alterações necessárias e salve digitando:

1
tecla esc + :w

Uma breve descrição sobre as operações básicas do vim:

  • tecla esc + :w serve para salvar sua alteração (write)
  • tecla esc + :q serve para fechar o arquivo (quit)
  • tecla esc + :x serve para salvar e fechar o arquivo

Criando o banco de dados

1
tecla esc + :Rake db:create

DB Create

Pressione a tecla enter como informado na mensagem.

Criado um scaffold

1
tecla esc + :Rgenerate scaffold car name:string description:text color:string

Será gerado o scaffold para o model car, logo em seguida será exibido o cars_controller.rb:

Cars Controller

Rodando as migrações

1
tecla esc + :Rake db:migrate

Migrate

Visualizando a aplicação

Caso você queira visualizar aplicação nesse momento, você pode inicializar o servidor e ver um preview da aplicação rodando no navegador:

Inicializando o servidor

1
tecla esc + :Rserver

Servidor

Vendo preview no navegador

1
tecla esc + :Rpreview

Preview

Nesse momento o gvim ficará travado e o navegador será aberto para você visualizar o andamento do projeto, quando você fechar o navegador o gvim será destravado.

Navegador

Navegação de arquivos

Eu conheço duas formas de navegação de arquivos, a primeira é muito rápida:

1
tecla esc + ctrl + f

Busca arquivo

Digite o nome do arquivo desejado, por exemplo new:

Busca Arquivo New

A outra forma de navegação é em diretórios, digite:

1
tecla esc + :Vex

Vex

Snippets

Esse pacote que instalamos para o vim, tem muitos snippets já configurados para acelerar a condificação, eles podem ser encontrados no diretório ~/.vim/snippets:

Snippets

Se você olhar nesses diretórios vai poder descobrir as siglas para acessar o snippets, dê uma boa olhada e teste.

Snippets Ruby on Rails

Vamos testar um pouco os snippets, agora que você já sabe procurar arquivos, abra o arquivo car.rb:

1
2
3
tecla esc + ctrl + f
digite car.rb
enter

Model

Digite i ou insert para colocar o gvim em modo de edição e digite:

1
vp + tecla tab

Model vp

Model vp tab

Agora e só apertar tab e ir substituindo os valores.

Caso o snippet não funcione, feche o gvim, acesse o diretório da aplicação Ruby on Rails (autocomplete), estando dentro do diretório autocomplete abra o gvim, agora os snippets tem que funcionar.

A ideia desse post é apenas dar um visão geral, existe várias outras coisas possíveis de fazer, e muitos outros comandos poderosos para trabalhar com Ruby on Rails no vim, por isso eu sugiro que você leia esses outros artigos:

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Ruby on Rails como usar callbacks do plugin Paperclip

Postado em 20 abr 2009
Categoria(s) Ruby on Rails

No plugin Paperclip existem dois callbacks que podem ser usados no model.

O primeiro é o before_column_post_process usado antes de salvar e o segundo after_column_post_process usado depois de salvar.

Onde aparece column troque pelo nome da sua coluna do anexo.

Por exemplo, a minha coluna se chama file, logo os nomes dos métodos ficam before_file_post_process e after_file_post_process:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Image < ActiveRecord::Base
  has_attached_file :file,
                    :styles => {:large => '600x600>', :medium => '300x300>', :small => '150x150>', :thumb => '50x50>'},
                    :path => ":rails_root/public/images/:id/:style_:basename.:extension",
                    :url => "/images/:id/:style_:basename.:extension"
  validates_attachment_presence :file
  validates_attachment_content_type :file, :content_type => ['image/jpeg', 'image/png', 'image/gif']
  before_file_post_process :post_before_process_file
  after_file_post_process :post_after_process_file
 
  def post_before_process_file
    raise "Executado antes de salvar"
  end
 
  def post_after_process_file
    raise "Executado depois de salvar"
  end
end

Você pode usar esses callbacks para fazer algum tratamento adicional nos anexos.

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Ruby on Rails Usando Rotas dentro do Model

Postado em 09 abr 2009
Categoria(s) Ruby on Rails

Se caso você precise usar rotas dentro do Model por algum motivo, aqui vai a dica, faça o include ActionController::UrlWriter no seu Model. Isso vai deixar disponível os métodos de geração de urls.

Por exemplo:

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
26
27
28
class NodeType < ActiveRecord::Base
  include ActionController::UrlWriter
 
  # ações realizadas após criar
  after_create :create_backend_menu
 
  # ações realizadas após apagar
  before_destroy :destroy_backend_menu
 
  # cria o menu para o conteúdo
  def create_backend_menu
    root = BackendMenu.find_by_path('admin_create_content_index_path')
 
    path = new_admin_node_type_node_path(self)
    root.children.create(:title => self.name,
      :path => path,
      :weight => 1,
      :is_active => true,
      :description => self.description)
  end
 
  # apaga o menu para o conteúdo
  def destroy_backend_menu
    path = new_admin_node_type_node_path(self)
    menu = BackendMenu.find_by_path(path)
    menu.destroy
  end
end

Até mais!

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark