sequência de bytes inválida em US-ASCII (erro de argumento) quando executo rake db: seed no Rails

87

Quando executo rake db:seedmeu Railsaplicativo, recebo este erro:

sequência de bytes inválida em US-ASCII (erro de argumento)

Acabei de adicionar science_majorse baixar ao meu arquivo de semente, e agora, quando executo, rake db:seedele me apresenta este erro:

erro de sequência de byte inválido

Por que isso ocorre e como posso corrigir isso?

parte de sementes.rb

@college = College.find_or_create_by_name!('University of Pittsburgh')
if @college.update_attributes(
  url: 'university-of-pittsburgh',
  public: 'Public',
  years: '4-year',
  category: 'National University',
  calendar: 'Semester',
  location: 'Pittsburgh, PA',
  setting: 'Large City (250-500k)',
  retention: '90',
  majors: 'business/marketing: 15%|social sciences: 14%|health professions: 11%|english: 10%|engineering: 9%|psychology: 8%|biology: 7%|history: 5%',
  scholarships_link: 'http://www.oafa.pitt.edu/universityschlrs.aspx',
  map: '<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=university+of+pittsburgh&amp;aq=&amp;sll=40.444261,-79.970448&amp;sspn=0.142165,0.251656&amp;ie=UTF8&amp;hq=university+of+pittsburgh&amp;t=m&amp;ll=40.443486,-79.958245&amp;spn=0.010798,0.021038&amp;output=embed"></iframe><br /><small><a href="https://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;geocode=&amp;q=university+of+pittsburgh&amp;aq=&amp;sll=40.431368,-79.9805&amp;sspn=0.142165,0.251656&amp;ie=UTF8&amp;hq=university+of+pittsburgh&amp;t=m&amp;ll=40.443486,-79.958245&amp;spn=0.010798,0.021038" style="color:#0000FF;text-align:left">View Larger Map</a></small>',
  street_view: '<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;geocode=&amp;q=University+of+Pittsburgh,+4200+Fifth+Ave,+Pittsburgh,+PA&amp;aq=0&amp;oq=uni&amp;sll=40.444261,-79.970448&amp;sspn=0.142165,0.251656&amp;ie=UTF8&amp;hq=University+of+Pittsburgh,+4200+Fifth+Ave,+Pittsburgh,+PA&amp;ll=40.443486,-79.958245&amp;spn=0.010798,0.021038&amp;t=m&amp;layer=c&amp;cbll=40.441775,-79.956671&amp;panoid=BgWQKMiSI1fpwP7JUF16Vg&amp;cbp=12,45.25,,0,-3.34&amp;output=svembed"></iframe><br /><small><a href="https://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;geocode=&amp;q=University+of+Pittsburgh,+4200+Fifth+Ave,+Pittsburgh,+PA&amp;aq=0&amp;oq=uni&amp;sll=40.431368,-79.9805&amp;sspn=0.142165,0.251656&amp;ie=UTF8&amp;hq=University+of+Pittsburgh,+4200+Fifth+Ave,+Pittsburgh,+PA&amp;ll=40.443486,-79.958245&amp;spn=0.010798,0.021038&amp;t=m&amp;layer=c&amp;cbll=40.441775,-79.956671&amp;panoid=BgWQKMiSI1fpwP7JUF16Vg&amp;cbp=12,45.25,,0,-3.34" style="color:#0000FF;text-align:left">View Larger Map</a></small>',
  housing: '<iframe src="http://www.tour.pitt.edu/tour-categories/residence-halls" scrolling="no" height="820" width="900"></iframe>',
  food: '<div style="overflow: hidden; max-width: 1000px;"><iframe scrolling="no" src="http://www.pc.pitt.edu/dining/menus.php" style="margin-left: 0; height: 2000px; margin-top: -370px; margin-bottom: -375px; width: 750px;"></iframe></div>',
  weather: '<div style="overflow: hidden; max-width: 500px;"><iframe scrolling="no" src="http://www.weather.com/weather/wxclimatology/monthly/graph/USPA1290" style="margin-left: -40px; height: 1570px; margin-top: -490px; width: 500px;"></iframe></div>',
  dorms: 'Towers (fr.)|Sutherland (fr.)|Lothrop (fr.)|Nordenberg (fr.)|Holland (fr.)|Forbes (fr.; honors)|McCormick|Brackenridge|Amos|Bruce|Panther|Pennsylvania|Ruskin|Bouquet Gardens|Oakwood Apartments|Centre-Plaza Apartments|Forbes-Craig Apartments (honors)',
  science_majors: 'Actuarial Mathematics|Applied Mathematics|Bioinformatics|Biological Sciences|Chemistry*|Computer Science|Ecology and Evolution|Environmental Geology|Environmental Studies|Geology|History and Philosophy of Science|Linguistics*|Mathematics*|Mathematics-Economics|Mathematics-Philosophy|Microbiology|Molecular Biology|Natural Sciences Area|Neuroscience*|Physics*|Physics and Astronomy|Scientific Computing|Statistics',
  social_science_majors: 'Economics*|Economics–Statistics|History*|Political Science*|Politics-Philosophy|Psychology|Sociology*|Urban Studies',
  humanities_majors: 'Africana Studies*|Africana Studies–English|Anthropology|Chinese*|Classics*|English Literature*|English Writing|Film Studies*|French*|German|History of Art & Architecture|Humanities Area|Italian*|Italian Studies|Japanese*|Liberal Studies|Music*|Philosophy*|Religious Studies*|Russian|Slavic Studies|Spanish|Studio Arts*|Theatre Arts*',
  business_majors: 'Accounting|Finance|General Management|Global Management|Marketing',
  engineering_majors: 'Bioengineering*|Chemical Engineering*|Civil Engineering*|Computer Engineering|Electrical Engineering*|Engineering Physics|Industrial Engineering*|Materials Science and Engineering*|Mechanical Engineering*',
  professional_majors: 'Administration of Justice*|Applied Developmental Psychology|Architectural Studies|Athletic Training|Clinical Dietetics and Nutrition|Communication: Rhet & Comm|Communication Science|Dental Hygiene|Emergency Medicine|Health Information Management|Health Services|Health and Physical Activity|Information Science|Legal Studies*|Media and Professional Communications|Nursing|Pharmacy|Public Service*|Rehabilitation Science|Social Work*'
)
else
  # handle validation errors
end

@college= College.find_or_create_by_name!('Harvard')
if @college.update_attributes(
  url: 'harvard',
  public: 'Private',
  years: '4-year',
  category: 'National University',
  calendar: 'Semester',
  location: 'Cambridge, MA',
  setting: 'Small City (50-250k)',
  degrees: 'Bachelors, Masters, Doctoral',
  rotc: 'Air Force, Army, Navy',
  considered: 'Academic GPA|Alumni Relation|Application Essay|Character/Personal Qualities|Extracurricular Activities|First Generation College Student|Geographical Residence|Interview|Racial/Ethnic Status|Recommendations|Rigor of secondary school record|Standardized Test Scores|Talent/Ability|Volunteer Work|Work Experience',
  student_faculty: '7 to 1')
else
  # handle validation errors
end

Eu deixei de fora todas as outras faculdades. Tenho 200 escolas até agora, mas Pitt é o único com dados abrangentes até agora. O restante possui apenas dados básicos, como Harvard. Eu também deixei de fora alguns dos dados para Pitt por uma questão de brevidade, mas me avise se você quiser que eu inclua o resto.

Edit: Eu tentei derrubar o *'s science_majorspara baixo e depois correr rake db:seed, mas isso não mudou nada.

Adam Zerner
fonte

Respostas:

179

Você está recebendo um erro de codificação porque seu sistema de arquivos não está configurado para codificar a data que você adicionou (já que presumivelmente inclui novos caracteres - possivelmente em seu URL de mapa codificado por entidade HTML - que não existiam em sua semente de dados anterior) .

O seguinte resolverá esse erro definindo a localidade UTF-8 em sua máquina:

# from your command line
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
bundle

A vantagem de definir uma localidade do sistema é que todas as gemas (daqui para frente) serão agrupadas usando a codificação UTF-8.

EDITAR:

Como alternativa, se você não quiser alterar a codificação do sistema, pode definir a codificação em todo o projeto, especificando um padrão de codificação em seu Gemfile:

if RUBY_VERSION =~ /1.9/ # assuming you're running Ruby ~1.9
  Encoding.default_external = Encoding::UTF_8
  Encoding.default_internal = Encoding::UTF_8
end
Zeantsoi
fonte
1
Ainda bem que ajudou. Se você adotar essa abordagem, certifique-se de que todos os ambientes em que implantou seu projeto tenham suas localidades definidas como UTF-8. Caso contrário, você precisará adicionar #encoding utf-8à parte superior do seu arquivo para garantir que ele esteja devidamente codificado, como o outro autor da postagem observa astutamente.
zeantsoi
Na verdade, tentei remover o #encoding utf-8 e fazer o que você disse, mas não funcionou. ~/collegeanswers >> export LANG=en_US.UTF-8 ~/collegeanswers >> export LC_ALL="en_US.UTF-8" ~/collegeanswers >> bundle Using rake (10.0.4) . . Using i18n (0.6.1) Your bundle is complete! Use bundle show [gemname] `para ver onde uma gem empacotada está instalada. ~ / collegeanswers >> rake db: seed rake aborted! `você sabe por quê?
Adam Zerner
Qual é o seu rakeerro? As gemas existentes provavelmente ainda não estão configuradas para funcionar com a codificação do sistema de arquivos. Tente bbundle exec gem uninstall i18nentão bundle install.
zeantsoi
meu erro de rake foi invalid byte sequence in US-ASCII (ArgumentError) . Acabei de tentar o que você disse e obtive o mesmo erro.
Adam Zerner
Você reiniciou seu servidor web? Atualizei minha resposta para fornecer mais opções para realizar o que você está tentando alcançar.
zeantsoi
64

Adicionar

#encoding: utf-8

no topo do arquivo

BvuRVKyUVlViVIc7
fonte
Por que preciso fazer isso agora, mas antes não precisava?
Adam Zerner de
Eu apenas tentei e funcionou btw, então obrigado! Mas eu ainda gostaria de saber por que tudo estava funcionando antes, e agora preciso adicionar isso para que funcione.
Adam Zerner de
1
Talvez você tenha adicionado alguns sinais utf-8 especiais em seu arquivo .. :)
BvuRVKyUVlViVIc7
Acabei de ler as atualizações da resposta do outro cara e, na verdade, é mais abrangente, então vou marcá-la como a resposta aceita, mas ainda assim agradeço muito sua ajuda!
Adam Zerner
39

Você também pode tentar, export RUBYOPT="-KU -E utf-8:utf-8" conforme mencionado neste tópico do GH

Lanwen
fonte
Obrigado! Essa é a única coisa que ajudou comshotgun-0.9.1/bin/shotgun:94:in `[]': invalid byte sequence in US-ASCII (ArgumentError)
Slava V
18

Se você estiver tendo esse problema em um contêiner docker ruby, você pode definir LANG=C.UTF-8:

docker run -it --rm -e LANG=C.UTF-8 ruby ...

ou assista a este problema .

Laktak
fonte
ou conforme visto no link desta resposta, se estiver criando sua própria imagem do Docker, adicione 'ENV LANG = C.UTF-8' ao seu Dockerfile
Alex
7

Como outros sugeriram, eu adicionei #encoding: utf-8 ao topo do meu arquivo (neste caso, seed.rb), mas ainda não consegui fazer a tarefa rake funcionar.

Curiosamente, um amigo recomendou que eu removesse os comentários adicionais gerados pelo Rails da parte superior do arquivo de seed para que apenas #encoding: utf-8 permanecessem.

O que você sabe - funcionou.

cheshireoctopus
fonte
1

Há um caractere inválido em seu arquivo de seed, no meu caso mudar aspas simples de `para 'funcionou.

Aldo Solis Zenteno
fonte