Rails 4 image-path, image-url และ asset-url ไม่ทำงานในไฟล์ SCSS อีกต่อไป


99

เราควรใช้อย่างอื่นนอกเหนือจากimage-urlและอื่น ๆ ใน Rails 4 หรือไม่? พวกเขาส่งคืนค่าที่แตกต่างกันซึ่งดูเหมือนจะไม่สมเหตุสมผล ถ้าผมมีlogo.pngใน/app/assets/images/logo.pngและฉันจะทำต่อไปนี้คือสิ่งที่ผมได้รับ:

image-url("logo.png") -> url("/images/logo.png") #obviously doesn't work
image-path("logo.png") -> "/images/logo.png"
asset-url("logo.png") -> url("/logo.png")

แน่นอนว่าไม่มีงานเหล่านี้เพราะพวกเขาต้องการอย่างน้อย/assetsต่อหน้า

UPDATE : จริงๆแล้วฉันเพิ่งสังเกตว่าฉันจะเข้าถึงภาพใน Rails 4 ได้อย่างไร ฉันมีภาพที่/app/assets/images/logo.png. แต่ถ้าฉันไปที่ URL ใด ๆ ต่อไปนี้ฉันยังไม่เห็นภาพของฉัน:

http://localhost:3000/assets/logo.png
http://localhost:3000/assets/images/logo.png
http://localhost:3000/logo.png
http://localhost:3000/images/logo.png

อัปเดต 2 : วิธีเดียวที่ฉันสามารถเรียกใช้งานได้logo.pngคือการย้ายไปยัง/app/assets/stylesheetsไดเร็กทอรีจากนั้นดึงขึ้น:

http://localhost:3000/assets/logo.png

ลองสิ่งนี้:asset_path("logo.png", image)
Marcelo De Polli

@depa - เพียงแค่แปลงเป็น "/logo.png" ซึ่งไม่แสดงภาพของฉัน
ที่.

3
คุณกำลังใช้ตัวช่วยนั้นภายใน.cssไฟล์หรือใน.css.scssไฟล์?
Marcelo De Polli

@depa - ไม่ใช้ตัวช่วยใด ๆ ฉันคิดว่านี่เป็นปัญหาที่ใหญ่กว่าของเนื้อหาที่ไม่ทำงานกับโฟลเดอร์รูปภาพของฉัน
ที่

1
@depa - ฉันเห็นสิ่งที่คุณถาม อยู่ใน.css.scssไฟล์
at

คำตอบ:


113

ฉันเพิ่งมีปัญหานี้ด้วยตัวเอง 3 คะแนนที่หวังว่าจะช่วยได้:

  • หากคุณวางรูปภาพในapp/assets/imagesไดเร็กทอรีของคุณคุณควรจะสามารถเรียกรูปภาพได้โดยตรงโดยไม่มีคำนำหน้าในเส้นทาง กล่าวคือ.image_url('logo.png')
  • ขึ้นอยู่กับว่าคุณใช้สินทรัพย์ที่ไหนจะขึ้นอยู่กับวิธีการ หากคุณกำลังใช้เป็นสถานที่ให้บริการแล้วสายของคุณของรหัสที่ควรจะเป็นbackground-image: background-image: image-url('logo.png')สิ่งนี้ใช้ได้กับทั้งสไตล์ชีทที่น้อยกว่าและ sass หากคุณใช้อินไลน์ในมุมมองคุณจะต้องใช้ตัวimage_tagช่วยในตัวรางเพื่อส่งออกภาพของคุณ อีกครั้งไม่มีคำนำหน้า<%= image_tag 'logo.png' %>
  • สุดท้ายนี้หากคุณกำลังรวบรวมเนื้อหาไว้ล่วงหน้าให้เรียกใช้rake assets:precompileเพื่อสร้างสินทรัพย์ของคุณหรือrake assets:precompile RAILS_ENV=productionเพื่อการผลิตมิฉะนั้นสภาพแวดล้อมการผลิตของคุณจะไม่มีเนื้อหาที่มีลายนิ้วมือเมื่อโหลดหน้า

นอกจากนี้สำหรับคำสั่งเหล่านั้นในจุดที่ 3 คุณจะต้องนำหน้าคำสั่งเหล่านั้นด้วยbundle execหากคุณใช้บันเดิลเลอร์


1
อีกประเด็นหนึ่งคือการอ่านเอกสารคู่มือ . rubyonrails.org/asset_pipeline.html นอกจากนี้คุณสามารถดูได้ใน Web Developer Debug ของเบราว์เซอร์ของคุณหากกำลังโหลดรูปภาพอยู่
H. Rabiee

3
ตอนนี้เป็นวิธีที่คุณเขียนคำตอบ แต่ละสถานการณ์ การคาดการณ์ "what ifs" ไม่มีปลายหลวม เครื่องหมายของใครบางคนที่ "เห็นการต่อสู้" (แก้ปัญหาได้จริงๆ)
ahnbizcad

ฉันถูกกัดโดยขาด RAILS_ENV = การผลิตหลายต่อหลายครั้ง
Sixty4Bit

62

สูตรแรกของคุณimage_url('logo.png')ถูกต้อง หากพบภาพจะสร้างเส้นทาง/assets/logo.png(บวกแฮชในการผลิต) อย่างไรก็ตามหาก Rails ไม่พบภาพที่คุณตั้งชื่อไว้ภาพนั้นก็จะถอยกลับไป/images/logo.pngแต่ถ้าทางรถไฟไม่สามารถหาภาพที่คุณตั้งชื่อก็จะถอยกลับไป

คำถามต่อไปคือทำไม Rails ไม่พบภาพของคุณ? หากคุณใส่ไว้ใน app / assets / images / logo.png คุณจะสามารถเข้าถึงได้โดยไปที่http://localhost:3000/assets/logo.pngแล้วคุณควรจะสามารถเข้าถึงได้โดยไปที่

หากได้ผล แต่ CSS ของคุณไม่อัปเดตคุณอาจต้องล้างแคช ลบtmp/cache/assetsออกจากไดเร็กทอรีโปรเจ็กต์ของคุณและรีสตาร์ทเซิร์ฟเวอร์ (webrick ฯลฯ )

หากล้มเหลวคุณสามารถลองใช้background-image: url(logo.png);That จะทำให้ CSS ของคุณค้นหาไฟล์ที่มีเส้นทางสัมพันธ์เดียวกัน (ซึ่งในกรณีนี้คือ / assets)


2
เพื่อข้ามไปยังสิ่งนี้ฉันถูกกัดโดยใช้เครื่องหมายคำพูดคู่บนเส้นทางรูปภาพแทนการใช้เครื่องหมายคำพูดเดี่ยว คุณใช้คำพูดเดี่ยวกับตัวช่วยเนื้อหาในไฟล์ css / scss
d_ethier

ฉันได้รับ "ตัวแปรท้องถิ่นหรือวิธีการที่ไม่ได้กำหนด` `รูปภาพ ''
มูฮัมหมัดอูเมอ

เป็นไปได้ไหมที่คุณใส่ช่องว่างก่อนรูปภาพคำศัพท์
Nick Urban

10

ฉันเพิ่งค้นพบว่าการใช้ตัวasset_urlช่วยช่วยแก้ปัญหานั้น

asset_url("backgrounds/pattern.png", image)

ผมได้รับundefined local variable or method 'image'ข้อผิดพลาด
Penguin

อาจมีอะไรเปลี่ยนแปลงบนรางคำตอบนี้เก่า! คุณสามารถลองasset_path("<your_path>", type: :image)
Leftis

8

ฉันมีปัญหาคล้ายกันพยายามเพิ่มภาพพื้นหลังด้วย inline css ไม่จำเป็นต้องระบุโฟลเดอร์รูปภาพเนื่องจากวิธีการซิงค์เนื้อหาทำงาน

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

background-image: url('/assets/image.jpg');

ขอบคุณฉันกำลังทำอยู่assets/img.jpgหรือ../assets/img.jpgเห็นได้ชัดว่าใช้ไม่ได้ในไดเรกทอรีใด ๆ /assets/img.jpgทำ. TY
ElliotM

5

Rails 4.0.0 จะมีลักษณะเป็นภาพที่กำหนดด้วย image-urlโครงสร้างไดเร็กทอรีเดียวกันกับไฟล์ css ของคุณ

ตัวอย่างเช่นถ้าใน CSS ของคุณassets/stylesheets/main.css.scss, กลายเป็นimage-url('logo.png')url(/assets/logo.png)

หากคุณย้ายไฟล์ CSS ของคุณเพื่อassets/stylesheets/cpanel/main.css.scss, กลายเป็นimage-url('logo.png')/assets/cpanel/logo.png

หากคุณต้องการใช้รูปภาพโดยตรงภายใต้ไดเร็กทอรีสินทรัพย์ / รูปภาพคุณสามารถใช้ asset-url('logo.png')


5

สำหรับสไตล์ชีต: url (asset_path ('image.jpg'))


3
คือสิ่งที่แตกต่างที่สำคัญระหว่างurl(asset_path('image.jpg'), url('image.jpg')และimage-url('image.jpg')? ฉันทำงานกับRails 5.0.0.1และurl()ทำงานได้ดีในไฟล์SCSSและในไฟล์html.erb ที่ฉันใช้asset_path()ดังนั้นฉันจึงต้องการทราบวิธีที่ถูกต้องในการไป ขอบคุณล่วงหน้า.
alexventuraio

asset_pathเพิ่มลงในไฟล์ภาพเป็นภาคผนวกแยกย่อย สำหรับการใช้งานจริงทุกครั้งหลังจากปรับใช้ภาคผนวกไดเอทจะมีการเปลี่ยนแปลงและเบราว์เซอร์ของผู้ใช้จะดาวน์โหลดรูปภาพเวอร์ชันใหม่
Alex Kojin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.