web-dev-qa-db-ja.com

Rails 3の画像パスの完全なURL

Carrierwaveのアップロードを含む画像があります:

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

私の見解では、この絶対URLを見つけたいと思います。 root_url を追加すると、二重の_/_になります。

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

rl_for (私が知っている)を使用することはできません。なぜなら、eitherがパスを渡すことを許可しているため、orリソースと_:only_path_オプションを識別するオプションのリスト。 「コントローラー」+「アクション」で識別できるリソースがないため、_:only_path_オプションを使用できません。

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

Rails3でフルURLへのパスを作成する最もクリーンで最良の方法は何でしょうか?

37
berkes

pathメソッドを試してください

Image.find(:first).image.path

[〜#〜] upd [〜#〜]

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

ヘルパーとしてラップして、DRY it forever

request.protocol + request.Host_with_port + Image.find(:first).image.url
33
fl00r

また、CarrierWaveのasset_Host config settingを次のように設定することもできます。

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

この^は、アプリのconfig.action_controller.asset_Host設定を使用するようにCarrierWaveに指示します。これは、config/envrionments/[environment].rbファイルの1つで定義できます。 詳細はこちら をご覧ください。

または、明示的に設定します。

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

アプリを再起動すると、準備完了です。ヘルパーメソッドは不要です。

* Rails 3.2およびCarrierWave 0.7.1を使用しています

98
ncherro

使用する別の簡単な方法はURI.parseです。あなたの場合は

require 'uri'

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

およびいくつかの例:

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" 
11
c2h2

フロアの答えを受け取ってヘルパーを提供するだけです:

# 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
Martin T.

ここにはたくさんの答えがあります。ただし、ポート、プロトコルなどを明示的に追加することを忘れずにすべてに依存しているため、私はそれらのいずれも好きではありませんでした。これが最もエレガントな方法であることがわかりました。

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

そして、それについての最も良いことは、たった1つのことを簡単に変更できることであり、あなたがどんなことをするにしても、いつも同じようにそれをするということです。プロトコルを削除し、 プロトコル相対URL を使用する場合は、文字列への最終的な変換の前にこれを実行してください。

full_url.scheme = nil

イェー、今、私は自分のアセットイメージのURLを、他の人が自分のサイトに追加したいコードスニペットで使用できるプロトコル相対URLに変換する方法を持っています。サイトがいずれかのプロトコルをサポートしていること)。

2
Timo

default_url_optionsを使用しました。これは、requestがメーラーで使用できず、以前に指定していなかった場合にconfig.action_controller.asset_Hostでホスト名を複製することを避けたためです。

config.asset_Host = ActionDispatch::Http::URL.url_for(ActionMailer::Base.default_url_options)
2
Eugene

メールでリクエストオブジェクトを参照することはできません。

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
Luke W

あなたは実際にこれを簡単に行うことができます

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

見た目は良くないが、仕事は終わらせることに同意する。

1
Alfie

ダブルスラッシュを回避するためにこのトリックを見つけました。

URI.join(root_url, image.url)
1
hlcs