Posts Tagged ‘sourcecode’

Ruby on Rails time_ago_in_words

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

Gosto muito de algumas coisas simples do Rails, o helper time_ago_in_words é uma delas, serve para escrever a quanto tempo ocorreu a partir da data atual.

Por exemplo:

1
2
3
time_ago_in_words(3.minutes.from_now)       # => 3 minutes
time_ago_in_words(Time.now - 15.hours)      # => 15 hours
time_ago_in_words(Time.now)                 # => less than a minute

Outro exemplo:

1
2
3
4
5
6
<ol class="timeline">
  <li> 
    <span class="title"><%= draft.title %></span>
    <span class="updated_at"><%= time_ago_in_words(draft.updated_at) %> ago</span>
  </li>
</ol>

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

  • Share/Bookmark

Algoritmo para fazer redimensionamento de imagens proporcionalmente

Postado em 15 mai 2009
Categoria(s) Algoritmo

Digamos que você tenha uma imagem na proporção 1280×850 px, vamos chamar essa imagem de original, e deseja fazer o redimensionamento proporcional para uma imagem nas medidas aproximadas de 408×544 px, que será chamada de final.

Exemplificando:

  • Imagem original: 1280×850
  • Imagem final (aproximada): 408×544

Algoritmo:

1
2
3
4
5
6
7
8
9
10
11
12
13
inicio
  escala_largura = largura_original / largura_final
  escala_altura = altura_original / altura_final
 
  se escala_largura < escala_altura
    escala = escala_largura
  senao
    escala = escala_altura
  fim se
 
  largura_proporcional = largura_original / escala
  altura_proporcional = altura_original / escala
fim

Teste:

1
2
3
4
5
6
7
8
9
10
11
12
13
inicio
  escala_largura = 1280 / 408 #3,137254902
  escala_altura = 850 / 544 #1,5625
 
  se escala_largura < escala_altura
    escala = escala_largura
  senao
    escala = escala_altura
  fim se
 
  largura_proporcional = 1280 / 1,5625 #819,2
  altura_proporcional = 850 / 1,5625 #544
fim

Esse teste gerá uma imagem proporcional de medidas 819,2×544 px.

Esse algoritmo leva em consideração que a imagem original sempre vai ser maior.

  • 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

Em Ruby on Rails o método inspect equivale ao print_r do PHP

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

Para que vem do PHP para o Rails vai sentir falta do print_r e var_dump.

No Rails podemos usar o método inspect para debugar o conteúdo de uma variável:

1
<%= @foo.inspect %>

Um exemplo de retorno:

1
[{"Muito ruim"=>28}, {"Ruim"=>14}, {"Regular"=>14}, {"Bom"=>28}, {"Ótimo"=>14}]

Seja feliz :-). Até mais.

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

  • Share/Bookmark

Ext JS carregar um combo box a partir de outro combo box

Postado em 16 jan 2009
Categoria(s) Ext JS, JavaScript

Nesse exemplo será construído dois combo boxs com framework Ext JS, um de estados e outro de cidades.

O combo box de cidades será carregado após selecionar o estado, ou seja, será exibido as cidades de um determinado estado.

Crie duas variáveis globais:

1
2
var SELECTED_STATE;
var CITY_STORE;

Crie o data store de estados e o combo box de estados:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var state_store = new Ext.data.JsonStore({
  fields: [
    {name: 'id', type: 'int'},
    {name: 'short', type: 'string'}
  ],
  proxy: new Ext.data.HttpProxy({
    url: 'getStates.php',
    method: 'GET'
  })
});
 
var state = new Ext.form.ComboBox({
  store: state_store,
  displayField: 'short',
  fieldLabel: 'Estado',
  name: 'state',
  anchor: '100%',
  emptyText: 'Selecione o estado...',
  typeAhead: true,
  forceSelection: true,
  triggerAction: 'all',
  selectOnFocus: true
});

Quando o combo box de estado for iniciado, será disparado uma requisição ajax para getStates.php e deve retorna um json de estados com os atributos id e short (usado para o nome curto do estado, por exemplo PR, SP, RJ, …)

Agora vamos criar o combo box de cidades:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CITY_STORE = new Ext.data.JsonStore({
  fields: [
    {name: 'id', type: 'int'},
    {name: 'name', type: 'string'}
  ],
  proxy: new Ext.data.HttpProxy({
    url: 'getCities.php',
    method: 'GET'
  })
});
 
var city = new Ext.form.ComboBox({
  store: CITY_STORE,
  displayField: 'name',
  fieldLabel: 'Cidade',
  name: 'city',
  anchor: '100%',
  emptyText: 'Selecione a cidade...',
  typeAhead: true,
  forceSelection: true,
  triggerAction: 'all',
  selectOnFocus: true
});

Repare que o data store de cidades usa a variável global CITY_STORE, vamos precisar acessar esse data store dentro de algumas funções.

A ideia aqui é quando for selecionado o estado, armazenar o id selecionado e usar para fazer a requisição ajax para getCities.php, buscando somente pelas cidades de um determinado estado. Para fazer isso precisamos adicionar um listener na combo box de estados:

1
state.addListener('select', onStateSelect);

Agora crie a função onStateSelect:

1
2
3
4
5
function onStateSelect(obj, record, index) {
  SELECTED_STATE = record.get('id');
  CITY_STORE.removeAll();
  CITY_STORE.load();
}

No código acima usamos a variável global SELECTED_STATE para armazenar o id do estado selecionado, também limpamos o data store de cidades caso já tenha sido uma requisição é zerado o combo box de cidades e disparamos a requisição para preencher o combo box de cidades.

Mas só fazendo isso não vai funcionar, é necessário adicionar o parâmetro state_id na requisição ajax para obter as cidades, podemos fazer isso da seguinte forma, adicione o código:

1
2
3
4
CITY_STORE.proxy.on('beforeload', function(proxy, params) {
  city.clearValue();
  params.state_id = SELECTED_STATE;
});

Antes de fazer a requisição ajax para as cidades, será adicionado o parâmetro state_id, usando um controle de eventos no Ext JS. Também limpo aqui o valor selecionado na combo box de cidades.

Bom, o Ext JS é fodinha mesmo, é meio complicado, a documentação é tão ampla que quebra as pernas. Ae você tem que balancear para ver até que ponto vale a pena usar ele. Uma coisa é verdade ele gera ótimas interfaces, mas toda essa sintaxe parece muito com o Swing do Java (coisa que eu não gosto em nada :-().

Esse exemplo é meio genérico, dá para usar tanto em combo box isolados ou com formulários em ext. Por isso você tem que fazer alguns ajustes para imprimir os combo boxs.

  • Share/Bookmark