Pertanyaan Url penuh untuk jalur gambar di Rails 3


Saya memiliki Gambar, yang berisi upload carrierwave:

Image.find(:first).image.url #=> "/uploads/image/4d90/display_foo.jpg"

Dalam pandangan saya, saya ingin menemukan url mutlak untuk ini. Menambahkan root_url menghasilkan dua kali lipat /.

root_url + image.url #=> http://localhost:3000//uploads/image/4d90/display_foo.jpg

Saya tidak bisa menggunakannya url_for (yang saya tahu), karena itu antara memungkinkan melewati jalan, atau daftar opsi untuk mengidentifikasi sumber daya dan :only_path pilihan. Karena saya tidak memiliki sumber daya yang dapat diidentifikasi melalui "controller" + "action" saya tidak dapat menggunakan :only_path pilihan.

url_for(image.url, :only_path => true) #=> wrong amount of parameters, 2 for 1

Apa yang akan menjadi cara terbaik dan terbersih untuk membuat jalur ke dalam url lengkap di Rails3?


35
2018-03-30 10:00


asal


Jawaban:


mencoba path metode

Image.find(:first).image.path

UPD

request.host + Image.find(:first).image.url

dan Anda bisa membungkusnya sebagai pembantu untuk mengeringkannya selamanya

request.protocol + request.host_with_port + Image.find(:first).image.url

33
2018-03-30 10:01



Anda juga dapat mengatur CarrierWave asset_host pengaturan konfigurasi seperti ini:

# config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.storage = :file
  config.asset_host = ActionController::Base.asset_host
end

Ini ^ memberitahu CarrierWave untuk menggunakan aplikasi Anda config.action_controller.asset_host pengaturan, yang dapat didefinisikan di salah satu dari Anda config/envrionments/[environment].rb file. Lihat disini untuk info lebih lanjut.

Atau tetapkan secara eksplisit:

  config.asset_host = 'http://example.com'

Mulai ulang aplikasi Anda, dan Anda siap menggunakannya - tidak diperlukan metode penolong.

* Saya menggunakan Rails 3.2 dan CarrierWave 0.7.1


92
2018-02-21 20:40



Metode lain yang mudah digunakan adalah URI.parse, dalam kasus Anda

require 'uri'

(URI.parse(root_url) + image.url).to_s

dan beberapa contoh:

1.9.2p320 :001 > require 'uri'
 => true 
1.9.2p320 :002 > a = "http://asdf.com/hello"
 => "http://asdf.com/hello" 
1.9.2p320 :003 > b = "/world/hello"
 => "/world/hello" 
1.9.2p320 :004 > c = "world"
 => "world" 
1.9.2p320 :005 > d = "http://asdf.com/ccc/bbb"
 => "http://asdf.com/ccc/bbb" 
1.9.2p320 :006 > e = "http://newurl.com"
 => "http://newurl.com" 
1.9.2p320 :007 > (URI.parse(a)+b).to_s
 => "http://asdf.com/world/hello" 
1.9.2p320 :008 > (URI.parse(a)+c).to_s
 => "http://asdf.com/world" 
1.9.2p320 :009 > (URI.parse(a)+d).to_s
 => "http://asdf.com/ccc/bbb" 
1.9.2p320 :010 > (URI.parse(a)+e).to_s
 => "http://newurl.com" 

10
2018-05-09 03:21



Hanya mengambil jawaban dari lantai dan memberikan helper:

# Use with the same arguments as image_tag. Returns the same, except including
# a full path in the src URL. Useful for templates that will be rendered into
# emails etc.
def absolute_image_tag(*args)
  raw(image_tag(*args).sub /src="(.*?)"/, "src=\"#{request.protocol}#{request.host_with_port}" + '\1"')
end

5
2017-08-18 16:38



Ada banyak jawaban di sini. Namun, saya tidak suka salah satu dari mereka karena mereka semua bergantung pada saya untuk secara eksplisit menambahkan port, protokol, dll. Saya menemukan ini sebagai cara paling elegan dalam melakukan ini:

full_url = URI( root_url )
full_url.path = Image.first.image.url
# Or maybe you want a link to some asset, like I did:
# full_url.path = image_path("whatevar.jpg")
full_url.to_s

Dan apa yang terbaik tentang hal itu adalah kita dapat dengan mudah mengubah satu hal dan tidak peduli apa pun itu, Anda selalu melakukannya dengan cara yang sama. Katakanlah jika Anda ingin menjatuhkan protokol dan dan gunakan URL Protokol-relatif, lakukan ini sebelum konversi akhir ke string.

full_url.scheme = nil

Yay, sekarang saya memiliki cara mengubah url gambar aset saya ke URL relatif protokol yang dapat saya gunakan pada cuplikan kode yang mungkin ingin ditambahkan orang lain di situs mereka dan mereka akan bekerja terlepas dari protokol yang mereka gunakan di situs mereka (menyediakan bahwa situs Anda mendukung salah satu protokol).


2
2017-11-18 14:10



Saya menggunakan default_url_options, karena request tidak tersedia di mailer dan menghindari duplikasi hostname di config.action_controller.asset_host jika belum ditentukan sebelumnya.

config.asset_host = ActionDispatch::Http::URL.url_for(ActionMailer::Base.default_url_options)

2
2017-09-08 16:43



Anda tidak bisa merujuk ke objek permintaan di email, jadi bagaimana dengan:

def image_url(*args)
    raw(image_tag(*args).sub /src="(.*?)"/, "src=\"//#{ActionMailer::Base.default_url_options[:protocol]}#{ActionMailer::Base.default_url_options[:host]}" + '\1"')
end

1
2018-06-29 22:19



Anda benar-benar dapat dengan mudah menyelesaikannya

root_url[0..-2] + image.url

Saya setuju itu tidak terlihat terlalu bagus, tetapi menyelesaikan pekerjaan .. :)


1
2017-07-03 11:14



Saya menemukan trik ini untuk menghindari slash ganda:

URI.join(root_url, image.url)

0
2017-11-21 19:20