Estou tentando colocar meu aplicativo em produção e os caminhos de recursos de imagem e css não estão funcionando.
Aqui está o que estou fazendo atualmente:
- Ativos de imagem em /app/assets/images/image.jpg
- As folhas de estilo estão em /app/assets/stylesheets/style.css
- Em meu layout, faço referência ao arquivo css desta forma:
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
- Antes de reiniciar o unicórnio, eu corro
RAILS_ENV=production bundle exec rake assets:precompile
e ele consegue e vejo os arquivos de impressão digital nopublic/assets
diretório.
Quando eu navego em meu site, recebo um erro 404 não encontrado para mysite.com/stylesheets/styles.css
.
O que estou fazendo de errado?
Atualização: no meu layout, é assim:
<%= stylesheet_link_tag "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
A fonte de geração é esta:
<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>
Parece que o Rails não está procurando apropriadamente pelos arquivos css compilados. Mas é muito confuso porque está funcionando corretamente para javascripts (observe o /assets/****.js
caminho).
stylesheet_link_tag
.<%= stylesheet_link_tag "style", media: "all", "data-turbolinks-track" => true %>
public/assets
e 2. verifique se não há outra instrução em algum lugar tentando carregar aquele arquivo css (presumivelmente codificado).home {background: #FFF url(<%= image_path 'hippopotamus.jpg' %>) no-repeat; }
pode realmente ser substituído na roda dentada por.home {background: #FFF url(image-path('hippopotamus.jpg')) no-repeat; }
. Talvez você possa tentar se isso ajudar.Respostas:
No trilho 4, você precisa fazer as alterações abaixo:
Isso funciona comigo. use o seguinte comando para pré-compilar recursos
Boa sorte!
fonte
config.serve_static_files
e configurar o alias no Apache e nginx para lidar com eleassets
.Acabei de ter o mesmo problema e encontrei esta configuração em config / environment / production.rb:
Mudar para fazê-
true
lo funcionar. Parece que por padrão o Rails espera que você tenha configurado seu servidor web front-end para lidar com solicitações de arquivos fora da pasta pública ao invés de procurá-los para o aplicativo Rails. Talvez você tenha feito isso para seus arquivos javascript, mas não para suas folhas de estilo CSS?( Veja a documentação do Rails 5 ). Como notado nos comentários, com Rails 5 você pode apenas definir a
RAILS_SERVE_STATIC_FILES
variável de ambiente, já que a configuração padrão éconfig.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
.fonte
config.serve_static_assets
foi renomeada paraconfig.serve_static_files
esclarecer sua função (ela apenas permite servir tudo napublic
pasta e não está relacionada ao pipeline de ativos). Oserve_static_assets
alias será removido no Rails 5.0. Migre seus arquivos de configuração de acordo.config.serve_static_files
no Rails 4.2 econfig.public_file_server.enabled
no Rails 5 . @see github.com/heroku/rails_serve_static_assets/blob/master/lib/…config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
para que você possa definir isso de forma diferente para o seu ambiente, sem alterar o código que é verificado em seu SCM.Em
/config/environments/production.rb
eu tive que adicionar isto:O .js já estava sendo pré-compilado, mas eu o adicionei mesmo assim. Aparentemente, .css e .css.erb não acontecem automaticamente. O
^[^_]
exclui parciais de serem compilados - é um regexp.É um pouco frustrante que os documentos afirmem claramente que o pipeline de ativos ESTÁ habilitado por padrão, mas não esclarece o fato de que se aplica apenas a javascripts.
fonte
Consegui resolver este problema mudando:
config.assets.compile = false
paraconfig.assets.compile = true
em/config/environments/production.rb
Atualização (24 de junho de 2018) : este método cria uma vulnerabilidade de segurança se a versão do Sprockets que você está usando for inferior a 2.12.5, 3.7.2 ou 4.0.0.beta8
fonte
Para Rails 5, você deve habilitar o seguinte código de configuração:
config.public_file_server.enabled = true
Por padrão, o Rails 5 vem com esta linha de configuração:
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
Portanto, você precisará definir a variável de ambiente
RAILS_SERVE_STATIC_FILES
como true.fonte
passenger_env_var RAILS_SERVE_STATIC_FILES true;
no bloco de localização do meu aplicativo em meu arquivo nginx.conf.Existem 2 coisas que você deve realizar para atender aos ativos em produção:
1) Para pré-compilar os ativos, você tem várias opções.
Você pode executar
rake assets:precompile
em sua máquina local, confirmá-lo no controle de código-fonte (git) e, em seguida, executar o programa de implantação, por exemplo, capistrano. Essa não é uma boa maneira de comprometer ativos pré-compilados ao SCM.Você pode escrever uma tarefa rake que é executada
RAILS_ENV=production rake assets:precompile
nos servidores de destino cada vez que você implanta seu aplicativo Rails para produção, antes de reiniciar o servidor.O código em uma tarefa para capistrano será semelhante a este:
2) Agora, você tem os ativos nos servidores de produção e precisa veiculá-los no navegador.
Novamente, você tem várias opções.
Ative o arquivo estático do Rails servindo em config / environment / production.rb
Usar Rails para servir arquivos estáticos vai matar o desempenho de seu aplicativo Rails.
Configure o nginx (ou Apache) para servir arquivos estáticos.
Por exemplo, meu nginx que foi configurado para funcionar com Puma se parece com isto:
fonte
O Rails 4 não gera mais a versão sem impressão digital do ativo: stylesheets / style.css não serão gerados para você.
Se você usar
stylesheet_link_tag
, o link correto para sua folha de estilo será geradoAlém disso,
styles.css
deve estar emconfig.assets.precompile
qual está a lista de coisas que são pré-compiladasfonte
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
Isso está incorreto? `<link data-turbolinks-track="true" href="https://stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
Mas os arquivos javascript estão corretos! Não entendo por que as mesmas configurações funcionam para arquivos .js, mas não para .css.serve_static_files
está obsoleto e será removido no Rails 5.1. Empublic_file_server.enabled = true
vez disso, use .404
. Você resolveu isso?mude sua linha de arquivo Production.rb
para dentro
e também adicionar
fonte
Estou executando o Ubuntu Server 14.04 , Ruby 2.2.1 e Rails 4.2.4 Eu segui um turorial de implantação da DigitalOcean e tudo correu bem, mas quando vou ao navegador e o endereço IP do meu VPS meu aplicativo é carregado, mas sem estilos e javascript.
O aplicativo está sendo executado com Unicorn e Nginx . Para corrigir esse problema, entrei em meu servidor usando SSH com meu usuário 'deployer' e acessei o caminho do meu aplicativo que é '/ home / deployer / apps / blog' e execute o seguinte comando:
Depois é só reiniciar o VPS e pronto! Funciona para mim!
Espero que possa ser útil para outra pessoa!
fonte
Se a pré-compilação estiver definida, você NÃO precisa
pois isso é para servir ativos ao vivo.
Nosso problema era que só tínhamos a base da chave secreta de desenvolvimento definida em
config/secrets.yml
Precisa de entrada para ambiente de produção
fonte
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
e para executarRAILS_ENV=production bundle exec rake assets:precompile
O que você NÃO DEVE fazer:
Alguns dos meus colegas acima recomendaram que você fizesse isso:
O pipeline de ativos do Rails diz sobre a abordagem acima:
O que você deveria fazer:
Pré-compile seus ativos.
RAILS_ENV=production rake assets:precompile
Você provavelmente pode fazer isso com uma tarefa de rake.
fonte
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
fonte
Em primeiro lugar, verifique seus ativos, pode ser possível que haja algum erro na pré-compilação de ativos.
Para pré-compilar ativos em produção ENV execute este comando:
Se mostrar erro, remova-o primeiro,
Em caso de erro de "variável indefinida", carregue esse arquivo de variável antes de usá-lo em outro arquivo.
exemplo:
no arquivo application.rb conjunto de sequência de pré-compilação de ativos
exemplo:
fonte
Encontrei isto:
A opção de configuração
config.serve_static_assets
foi renomeadaconfig.serve_static_files
para esclarecer sua função.em
config/environments/production.rb
:Portanto, defina env
RAILS_SERVE_STATIC_FILES
ou usingNginx
para servir arquivos estáticos. Adicionarconfig.serve_static_assets = true
ainda funcionará, mas será removido no futuro.fonte
não é recomendado deixar o capistrano fazer a pré-compilação dos ativos, porque pode levar anos e muitas vezes expirar. tente fazer a pré-compilação dos ativos locais.
Primeiro, defina em config / application.rb
config.assets.initialize_on_precompile = false
e faça localRAILS_ENV=production bin/rake assets:precompile
e adicione esses public / assets ao git.e config / environment / development.rb, altere o caminho do seu ativo para evitar o uso de ativos pré-compilados:
config.assets.prefix = '/dev-assets'
Se você tiver problema de conexão db, significa que você tem um inicializador que usa db. uma maneira de contornar isso é definir um novo ambiente duplicando production.rb como, talvez, production2 .rb, e em database.yml, adicionar o ambiente production2 com configuração de banco de dados de desenvolvimento . então faça
RAILS_ENV=production2 bin/rake assets:precompile
se você ainda está enfrentando algum problema com ativos, por exemplo ckeditor, adicione o arquivo js em config / initializers / assets.rb
Rails.application.config.assets.precompile += %w( ckeditor.js )
fonte
Posso estar errado, mas aqueles que recomendam mudar
config.assets.compile = true
O comentário nesta linha diz: # Não faça fallback para o pipeline de recursos se um recurso pré-compilado for perdido.
Isso sugere que, ao definir isso como true, você não está corrigindo o problema, mas sim ignorando-o e executando o pipeline todas as vezes. Isso certamente deve matar seu desempenho e anular o propósito do pipeline?
Eu tive esse mesmo erro e foi devido ao aplicativo rodando em uma subpasta que o rails não conhecia.
Portanto, meu arquivo css estava em home / subfolder / app / public / .... mas rails estava em home / app / public / ...
tente mover seu aplicativo para fora da subpasta ou dizer ao Rails que ele está em uma subpasta.
fonte
Isso resolveu o meu problema na produção. Coloque-o na configuração do nginx.
fonte
Mesmo nós enfrentamos o mesmo problema onde
RAILS_ENV=production bundle exec rake assets:precompile
tivemos sucesso, mas as coisas não funcionaram como esperado.Descobrimos que o unicórnio era o principal culpado aqui.
Como no seu caso, mesmo nós costumávamos reiniciar o Unicórnio após compilar os ativos. Percebeu-se que quando o unicórnio é reiniciado, apenas seus processos de trabalho são reiniciados e não o processo mestre.
Este é o principal motivo pelo qual os ativos corretos não são veiculados.
Mais tarde, após compilar os ativos, paramos e iniciamos o unicórnio para que o processo mestre do unicórnio também seja reiniciado e os ativos corretos sejam entregues.
Parar e iniciar o unicórnio traz cerca de 10 segundos de tempo de inatividade em comparação com reiniciá-lo. Esta é a solução alternativa que pode ser usada quando a solução de longo prazo é mudar de unicórnio para puma.
fonte