Importação CSV de Tag / TagGroup diferencia maiúsculas de minúsculas, mas não é

Reprodução:

  • Tenha uma tag chamada ABC
  • Crie um CSV com a tag abc
  • Vá para /tags e carregue o CSV
  • Veja falhar com “Desculpe, houve um erro ao carregar foo.csv. Por favor, tente novamente.”

Isso está acontecendo porque as tags diferenciam maiúsculas de minúsculas, mas devem ser exclusivas ignorando a capitalização.

Se você tiver um arquivo com 1000 tags, é um grande trabalho descobrir onde ele dá errado.

O código faz isso

TAG = Tag.find_by_name(tag_name) || Tag.create!(name: tag_name)
...
TAG_GROUP = TagGroup.find_by(name: tag_group_name) || TagGroup.create!(name: tag_group_name)

que é um padrão ruim, já que find_by_name diferencia maiúsculas de minúsculas e create! não [1], então ele falha com ActiveRecord::RecordInvalid : Validation failed: Name has already been taken

Isso deveria ser algo como

tag = Tag.where('name ILIKE ?', tag_name).first || Tag.create!(name: tag_name)


  1. porque validates :name, presence: true, uniqueness: { case_sensitive: false } ↩︎

3 curtidas

Obrigado por relatar, coloque um pr-welcome nisso, acho que precisamos mudar esse find_by_name para fazer uma busca que não diferencie maiúsculas de minúsculas.

Dado que temos:

A correção seria:

TAG = Tag.where('lower(name) = ?', tag_name.downcase).first

TagGroup está sem o índice, então precisaríamos adicioná-lo e fazer o mesmo lá.

Olá @RGJ

Não consegui reproduzir seu problema com uma tag normal mas obtive o erro que você mencionou com um grupo de tags.

Este é o meu CSV de exemplo:

ABC,TAGGROUP

ABC funciona bem, mas com o tag_group, ele daria erro. Se você puder compartilhar um CSV de exemplo, ficarei feliz em ajudar!

Fiz um PR corrigindo o problema do grupo de tags. Além disso, SiteSetting.force_lowercase_tags está ativado no seu fórum?

1 curtida

Não, está desmarcado. Desculpe, agora vejo que isso importa.

Não tenho certeza de como você está tentando reproduzir, mas o CSV deve ter um abc em minúsculas e force_lowercase_tags deve estar desmarcado.

1 curtida

Sem problemas, era uma configuração do site que encontrei ao vasculhar o código, pode ser importante!

Seu CSV é apenas o abc sem grupos de tags?

Nosso exemplo de teste é (e eu testei localmente, tendo capitaltag2 em maiúsculas, mas funcionou como esperado):

Eu de fato não consigo reproduzir apenas com uma tag.

Cometi um pequeno erro na minha OP:

Tag.find_by_name não diferencia maiúsculas de minúsculas (bom) e Tag.find_by(name: ) diferencia maiúsculas de minúsculas (ruim).
Isso ocorre porque David já corrigiu para tags 7 anos atrás, substituindo o método find_by_name.

Para TagGroup, essa correção nunca foi aplicada.

2 curtidas