Saya mencoba memasukkan aplikasi saya ke dalam produksi dan image serta jalur aset css tidak berfungsi.
Inilah yang saya lakukan saat ini:
- Aset gambar ada di /app/assets/images/image.jpg
- Stylesheet ada di /app/assets/stylesheets/style.css
- Dalam tata letak saya, saya mereferensikan file css seperti ini:
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
- Sebelum memulai ulang unicorn, saya menjalankan
RAILS_ENV=production bundle exec rake assets:precompile
dan berhasil dan saya melihat file sidik jari dipublic/assets
direktori.
Saat saya menelusuri situs saya, saya mendapatkan kesalahan 404 tidak ditemukan untuk mysite.com/stylesheets/styles.css
.
Apa yang saya lakukan salah?
Pembaruan: Dalam tata letak saya, terlihat seperti ini:
<%= 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 %>
Sumber yang dihasilkan adalah ini:
<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>
Sepertinya Rails tidak mencari file css yang telah dikompilasi dengan benar. Tetapi sangat membingungkan mengapa ini berfungsi dengan benar untuk javascripts (perhatikan /assets/****.js
jalurnya).
ruby-on-rails
ruby
asset-pipeline
ruby-on-rails-4
emersonthis
sumber
sumber
stylesheet_link_tag
.<%= stylesheet_link_tag "style", media: "all", "data-turbolinks-track" => true %>
public/assets
dan 2. periksa kembali apakah tidak ada instruksi lain di suatu tempat yang mencoba memuat file css itu (mungkin dengan kode keras).home {background: #FFF url(<%= image_path 'hippopotamus.jpg' %>) no-repeat; }
sebenarnya dapat diganti dalam sproket dengan.home {background: #FFF url(image-path('hippopotamus.jpg')) no-repeat; }
. Mungkin Anda bisa mencoba jika ini membantu.Jawaban:
Di rel 4 Anda perlu melakukan perubahan di bawah ini:
Ini bekerja dengan saya. gunakan perintah berikut untuk melakukan pra-kompilasi aset
Semoga berhasil!
sumber
config.serve_static_files
, dan mengkonfigurasi alias di Apache dan nginx untuk ditanganiassets
.Saya baru saja mengalami masalah yang sama dan menemukan pengaturan ini di config / environment / production.rb:
Menggantinya menjadi
true
berfungsi. Sepertinya secara default Rails mengharapkan Anda untuk mengonfigurasi server web front-end Anda untuk menangani permintaan file dari folder publik alih-alih mem-proxy-nya ke aplikasi Rails. Mungkin Anda telah melakukan ini untuk file javascript Anda tetapi bukan lembar gaya CSS Anda?( Lihat dokumentasi Rails 5 ). Seperti disebutkan dalam komentar, dengan Rails 5 Anda dapat mengatur
RAILS_SERVE_STATIC_FILES
variabel lingkungan, karena pengaturan default adalahconfig.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
.sumber
config.serve_static_assets
telah diubah namanya menjadiconfig.serve_static_files
untuk memperjelas perannya (ini hanya memungkinkan penyajian semua yang ada dipublic
folder dan tidak terkait dengan pipa aset). Theserve_static_assets
alias akan dihapus dalam Rails 5.0. Harap migrasikan file konfigurasi Anda sebagaimana mestinya.config.serve_static_files
di Rails 4.2 danconfig.public_file_server.enabled
di Rails 5 . @see github.com/heroku/rails_serve_static_assets/blob/master/lib/…config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
sehingga Anda dapat mengatur ini secara berbeda untuk lingkungan Anda tanpa mengubah kode yang diperiksa ke SCM Anda.Dalam
/config/environments/production.rb
aku harus menambahkan ini:.Js sudah dikompilasi sebelumnya, tapi saya tetap menambahkannya. .Css dan .css.erb tampaknya tidak terjadi secara otomatis. The
^[^_]
tidak termasuk parsial dari yang disusun - itu regexp.Agak menjengkelkan bahwa dokumen dengan jelas menyatakan bahwa jalur pipa aset diaktifkan secara default tetapi tidak mengklarifikasi fakta bahwa hanya berlaku untuk javascript.
sumber
Saya dapat mengatasi masalah ini dengan mengubah:
config.assets.compile = false
menjadiconfig.assets.compile = true
dalam/config/environments/production.rb
Pembaruan (24 Juni 2018) : Metode ini membuat kerentanan keamanan jika versi Sprocket yang Anda gunakan kurang dari 2.12.5, 3.7.2, atau 4.0.0.beta8
sumber
Untuk Rails 5, Anda harus mengaktifkan kode konfigurasi berikut:
config.public_file_server.enabled = true
Secara default, Rails 5 dikirimkan dengan baris konfigurasi ini:
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
Oleh karena itu, Anda perlu menyetel variabel lingkungan
RAILS_SERVE_STATIC_FILES
ke true.sumber
passenger_env_var RAILS_SERVE_STATIC_FILES true;
di blok lokasi aplikasi saya di file nginx.conf saya.Ada 2 hal yang harus Anda capai untuk melayani aset dalam produksi:
1) Untuk melakukan prakompilasi aset, Anda memiliki beberapa pilihan.
Anda dapat menjalankan
rake assets:precompile
di komputer lokal Anda, memasukkannya ke kontrol kode sumber (git), lalu menjalankan program penerapan, misalnya capistrano. Ini bukan cara yang baik untuk memasukkan aset yang telah dikompilasi ke SCM.Anda dapat menulis tugas rake yang berjalan
RAILS_ENV=production rake assets:precompile
di server target setiap kali Anda menerapkan aplikasi Rails ke produksi, sebelum Anda memulai ulang server.Kode dalam tugas untuk capistrano akan terlihat seperti ini:
2) Sekarang, Anda memiliki aset di server produksi, Anda perlu menyajikannya ke browser.
Sekali lagi, Anda punya beberapa pilihan.
Aktifkan penyajian file statis Rails di config / environment / production.rb
Menggunakan Rails untuk menyajikan file statis akan mematikan kinerja aplikasi Rails Anda.
Konfigurasikan nginx (atau Apache) untuk menyajikan file statis.
Misalnya, nginx saya yang dikonfigurasi untuk bekerja dengan Puma terlihat seperti ini:
sumber
Rails 4 tidak lagi menghasilkan versi non-sidik jari dari aset: stylesheets / style.css tidak akan dibuat untuk Anda.
Jika Anda menggunakan
stylesheet_link_tag
maka tautan yang benar ke lembar gaya Anda akan dibuatSelain itu
styles.css
harus diconfig.assets.precompile
dalam daftar hal-hal yang telah dikompilasisumber
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
Apakah ini salah? `<link data-turbolinks-track="true" href="https://stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
Tetapi file javascriptnya benar! Saya tidak mengerti mengapa konfigurasi yang sama berfungsi untuk file .js tetapi tidak .css.serve_static_files
tidak digunakan lagi dan akan dihapus di Rails 5.1. Silakan gunakanpublic_file_server.enabled = true
sebagai gantinya.404
. Apakah Anda menyelesaikan ini?ubah baris file Production.rb Anda
ke
dan juga menambahkan
sumber
Saya menjalankan Ubuntu Server 14.04 , Ruby 2.2.1 dan Rails 4.2.4. Saya telah mengikuti turorial penyebaran dari DigitalOcean dan semuanya berjalan dengan baik tetapi ketika saya pergi ke browser dan memasukkan alamat IP dari VPS saya, aplikasi saya dimuat tetapi tanpa gaya dan javascript.
Aplikasi ini berjalan dengan Unicorn dan Nginx . Untuk memperbaiki masalah ini, saya memasuki server saya menggunakan SSH dengan 'deployer' pengguna saya dan pergi ke jalur aplikasi saya yaitu '/ home / deployer / apps / blog' dan jalankan perintah berikut:
Kemudian saya baru saja me-restart VPS dan hanya itu! Ini berhasil untuk saya!
Semoga bisa bermanfaat untuk orang lain!
sumber
Jika precompile disetel, Anda TIDAK perlu
karena ini untuk melayani aset secara langsung.
Masalah kami adalah kami hanya memiliki basis kunci rahasia pengembangan
config/secrets.yml
Perlu masuk untuk lingkungan produksi
sumber
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
dan jalankanRAILS_ENV=production bundle exec rake assets:precompile
Apa yang HARUS Anda lakukan:
Beberapa rekan saya di atas telah merekomendasikan Anda untuk melakukan ini:
Pipa aset rel mengatakan tentang pendekatan di atas:
Apa yang HARUS Anda lakukan:
Pra-kompilasi aset Anda.
RAILS_ENV=production rake assets:precompile
Anda mungkin dapat melakukannya dengan tugas menyapu.
sumber
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
sumber
Pertama-tama periksa aset Anda, mungkin saja ada kesalahan dalam pra-kompilasi aset.
Untuk melakukan pra-kompilasi aset dalam produksi ENV, jalankan perintah ini:
Jika itu menunjukkan kesalahan, hapus itu dulu,
Jika terjadi kesalahan "variabel tidak ditentukan", muat file variabel tersebut sebelum menggunakannya di file lain.
contoh:
dalam file application.rb mengatur urutan pra-kompilasi aset
contoh:
sumber
Menemukan ini:
Opsi konfigurasi
config.serve_static_assets
telah diubah namanya menjadiconfig.serve_static_files
untuk memperjelas perannya.di
config/environments/production.rb
:Jadi setel env
RAILS_SERVE_STATIC_FILES
atau useNginx
untuk melayani file statis. Tambahkanconfig.serve_static_assets = true
akan tetap berfungsi, tetapi dihapus di masa mendatang.sumber
tidak disarankan untuk membiarkan capistrano melakukan prakompilasi aset, karena dapat memakan waktu lama dan seringkali waktu habis. coba lakukan precompile aset lokal.
Pertama, setel di config / application.rb
config.assets.initialize_on_precompile = false
lalu lakukan localRAILS_ENV=production bin/rake assets:precompile
dan tambahkan public / assets itu ke git.dan config / environment / development.rb, ubah jalur aset Anda untuk menghindari penggunaan aset yang telah dikompilasi sebelumnya:
config.assets.prefix = '/dev-assets'
Jika Anda memiliki masalah koneksi db, berarti Anda memiliki penginisialisasi yang menggunakan db. salah satu cara untuk mengatasinya adalah dengan menyetel lingkungan baru dengan menduplikasi production.rb sebagai mungkin production2 .rb, dan di database.yml, menambahkan lingkungan produksi2 dengan pengaturan db pengembangan . lalu lakukan
RAILS_ENV=production2 bin/rake assets:precompile
jika Anda masih menghadapi masalah dengan aset, misalnya ckeditor, tambahkan file js ke config / initializers / assets.rb
Rails.application.config.assets.precompile += %w( ckeditor.js )
sumber
Saya mungkin salah tetapi mereka yang merekomendasikan perubahan
config.assets.compile = true
Komentar di baris ini berbunyi: #Jangan mundur ke jalur aset jika aset yang telah dikompilasi terlewat.
Ini menunjukkan bahwa dengan menyetel ini ke true, Anda tidak memperbaiki masalah, melainkan melewatinya dan menjalankan pipeline setiap saat. Ini pasti harus mematikan kinerja Anda dan mengalahkan tujuan pipa?
Saya mengalami kesalahan yang sama dan itu karena aplikasi yang berjalan di sub folder yang tidak diketahui oleh rel.
Jadi file css saya ada di home / subfolder / app / public / .... tapi rails mencari di home / app / public / ...
coba pindahkan aplikasi Anda keluar dari subfolder atau beri tahu rel bahwa itu ada di subfolder.
sumber
Ini memperbaiki masalah saya dalam produksi. Masukkan ke konfigurasi nginx.
sumber
Meskipun kami menghadapi masalah yang sama dimana
RAILS_ENV=production bundle exec rake assets:precompile
berhasil tetapi hal-hal tidak berjalan sesuai harapan.Kami menemukan bahwa unicorn adalah penyebab utama di sini.
Sama seperti kasus Anda, bahkan kami biasa memulai ulang unicorn setelah mengompilasi aset. Telah diketahui bahwa ketika unicorn di-restart, hanya proses pekerja yang di-restart dan bukan proses master.
Inilah alasan utama mengapa aset yang benar tidak terlayani.
Kemudian, setelah mengompilasi aset, kami menghentikan dan memulai unicorn sehingga proses master unicorn juga dimulai ulang dan aset yang benar sedang disajikan.
Menghentikan dan memulai unicorn membawa sekitar 10 detik waktu henti jika dibandingkan dengan memulai ulang unicorn. Ini adalah solusi yang bisa digunakan dimana solusi jangka panjang dipindahkan ke puma dari unicorn.
sumber