Problema ao usar resources com palavras sem plural

No V2V nós criamos um resource que é utilizado para o formulário de contato (formmail) do site. O nome do resource é contact_us. O nosso routes.rb ficava assim:

map.resources :contact_us

E temos uma configuração de inflector para informar ao Rails que essa é uma expressão incontável:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable %w(contact_us)
end

O problema é que ao tentar gerar a url com o método contact_us_url para o formulário acontece o seguinte erro:

contact_us_url failed to generate from {:controller=>"contact_us", :action=>"show"} - you may have ambiguous routes, or you may need to supply additional parameters for this route.  content_url has the following required parameters: ["contact_us", :id] - are they all satisfied?

Isso acontece pois o Rails sobrescreve o método que gera a url da coleção com o método que gera a url de instância dos objetos. Para resolver isso temos que informar no arquivo de rotas o nome que será utilizado nos métodos no caso de ser uma instância e não uma coleção:

map.resources :contact_us, :singular => :contact_us_item

Isso fará os métodos ficarem assim:

contact_us_path() => /contact_us
new_contact_us_item_path() => /contact_us/new
contact_us_item_path(1) => /contact_us/1
edit_contact_us_item_path(1) => /contact_us/1

Reparem que no caso de não ser usada a opção :singular o método de acesso a coleção e da instância ficam com nomes iguais:

contact_us_path() => /contact_us
contact_us_path(1) => /contact_us/1

Isso não acontece com expressões normais pois o Rails utiliza para a coleção a expressão com pluralize. Supondo que o nosso resource fosse de posts, os métodos seriam:

posts_path() => /posts
new_post_path() => /posts/new
post_path(1) => /posts/1
edit_post_path(1) => /posts/1

2 comentários : 22.01.2009 11:46 PM

O dia em que meu blog viu o 666 ;)

666

0 comentários : 22.01.2009 11:23 PM

V2V Procura por desenvolvedores Rails

Logo V2V

O Portal do Voluntário é um projeto que incentiva ações de voluntariado no âmbito nacional. Lá foi desenvolvida uma rede social chamada V2V. Inicialmente era um projeto em php, sem testes e difícil de manter. Quando eu saí do Lucidus, o Fernando me convidou para integrar a equipe dele e iniciar o desenvolvimento da nova versão do V2V, utilizando Rails e todas as boas práticas de desenvolvimento, testes etc.

Quem começou o trabalho foi o Eduardo Rocha com um projeto de prova de conceito, eu dei continuidade. Em menos de 6 meses já possuímos dois sites no ar utilizando o novo sistema, entre eles o próprio site do Portal do Voluntário. E o trabalho está apenas começando, há muita coisa para fazer!

No antigo sistema em php, havia uma instância da aplicação para cada site que o utilizava. No novo sistema em Rails temos apenas uma instância da aplicação e que terá que suportar o site de todos os clientes do Portal do Voluntário que utilizam o V2V. Será um desafio e tanto… Antes da entrada do terceiro site, que acontecerá em março, já começaremos a utilizar cache de fragmento em algumas partes específicas do site como a nuvem de tags. Em seguida, provavelmente passaremos pelo memcached e, por último, quero chegar no cache de página, mesmo com sistema respondendo por vários domínios.

Ou seja: é uma oportunidade única de trabalhar num projeto em Rails, desenvolvido da forma correta desde do zero e que fatalmente terá que escalar. Devido as minhas outras atribuições no Redeparede, eu não tenho como me dedicar mais ao V2V e não estou dando conta sozinho de todas as tarefas.

Procuramos um desenvolvedor Rails com alguma(ou muita) experiência para trabalhar alocado full-time em nossa sede no Jardim Botânico, Rio de Janeiro. Dessa vez não tem como ser remoto. Além de trabalhar no desenvolvimento do projeto, também irá contribuir no treinamento da atual equipe de 5 desenvolvedores que mantém o antigo sistema em php.

Nas próximas semanas faremos a reorganização da nossa sala, que será preparada para ficar nos moldes do XP. O ambiente é informal e descontraído, sem dúvida um ótimo lugar para trabalhar.

Interessados entrem em contato em pvt.

1 comentário : 22.01.2009 12:07 PM

acts_as_taggable_on_steroids e will_paginate

Num dos projetos que trabalho utilizo o plugin acts_as_taggable_on_steroids. Pela primeira vez fui fazer paginação de elementos com tags utilizando o will_paginate. O acts_as_taggable_on_steroids fornece o método de classe find_tagged_with que serve para buscar por items com uma determinada tag:

Post.find_tagged_with('rails')

E é possível fazer paginação utilizando o método paginate_tagged_with, mas o problema é que ele não funciona como deveria. Apesar de fazer a paginação funcionar corretamente, a sql que ele gera para fazer o count dos elementos não é correta. Se usado sem conditions, ele gera o número de páginas considerando todos os elementos da base. Eu escrevi o seguinte monkey patch, que coloquei no /lib do projeto:

module ActiveRecord
  module Acts
    module Taggable
      module SingletonMethods
        def paginate_tagged_with(tags, args = {})
          options = find_options_for_find_tagged_with(tags, :match_all => true)
          options.merge!(args)
          paginate(options.merge(:count => { :select => options[:select].gsub("#{table_name}.*", "#{table_name}.id") }))
        end
      end
    end
  end
end

Para usar basta colocar no seu controller algo como:

@posts = Post.paginate_tagged_with(params[:tag_id], :page => params[:page] || 1)

Também escrevi uma spec para testar o funcionamento. Ela só faz sentido dentro do contexto do meu projeto, mas basta você modificar as fixtures, os modelos, etc, de acordo com seu projeto.

describe Post do
  it "should return the correct total_pages to will_paginate" do
    post = posts(:blog_post)
    5.times do
      new_post = BlogPost.new(post.attributes)
      new_post.tag_list = 'global'
      new_post.save
    end
    paginator = BlogPost.paginate_tagged_with('global', :page => 1, :per_page => 2)
    paginator.total_entries.should == 6
    paginator.total_pages.should == 3
  end
end

2 comentários : 21.01.2009 12:09 AM

Resultado da Promoção de Natal da Hostnet

Logo Hostnet

Pessoal, peço desculpas pela demora no resultado, mas fim de ano é sempre bem corrido. Fiquei decepcionado com a quantidade de projetos que foram enviados. Menos de 10! Escolhemos os que tinham mais conteúdo e que apresentaram potencial de sucesso. Foram 3 escolhidos. Como foram muito poucos, eles ganharão 1 ano de hospedagem grátis! Aí vão eles:

Parabéns a todos! Entraremos em contato com vocês!

2 comentários : 03.01.2009 10:44 PM