Rails 3中图像路径的完整URL

时间:2011-03-30 10:00:29

标签: ruby-on-rails ruby ruby-on-rails-3 url path

我有一张图片,其中包含了载波上传:

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

在我看来,我想为此找到绝对的网址。将root_url结果添加为/。{/ p>

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

我无法使用url_for(我知道),因为 允许传递路径,一个选项列表来识别资源和:only_path选项。由于我没有可通过“controller”+“action”识别的资源,因此我无法使用:only_path选项。

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

在Rails3中创建一个完整URL路径的最简洁和最好的方法是什么?

9 个答案:

答案 0 :(得分:96)

您还可以像这样设置CarrierWave的asset_host配置设置:

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

这^告诉CarrierWave使用您应用的config.action_controller.asset_host设置,该设置可以在您的config/envrionments/[environment].rb个文件中定义。 See here了解更多信息。

或明确设置:

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

重启你的应用程序,你很高兴 - 不需要帮助方法。

*我正在使用Rails 3.2和CarrierWave 0.7.1

答案 1 :(得分:33)

尝试path方法

Image.find(:first).image.path

<强> UPD

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

你可以把它包装成帮助它永远干掉它

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

答案 2 :(得分:10)

另一个使用的简单方法是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" 

答案 3 :(得分:5)

接受答辩并提供帮助:

# 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

答案 4 :(得分:2)

这里有很多答案。但是,我并不喜欢它们中的任何一个,因为它们都依赖我来记住显式添加端口,协议等。我发现这是最优雅的方式:

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

关于它的最好的事情是,我们可以轻松地改变一件事,无论你做什么,你总是以同样的方式做。如果您想删除协议并使用The Protocol-relative URL,请在最终转换为字符串之前执行此操作。

full_url.scheme = nil

是的,现在我有办法将我的资产图片网址转换为协议相对网址,我可以在其他人可能希望在其网站上添加的代码段中使用它们,无论他们使用何种协议,他们都可以使用在他们的网站上(假设您的网站支持任何协议)。

答案 5 :(得分:2)

我使用了default_url_options,因为request在邮件程序中不可用,如果之前没有指定,则避免在config.action_controller.asset_host中复制主机名。

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

答案 6 :(得分:1)

您无法在电子邮件中引用请求对象,那么如何:

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

答案 7 :(得分:1)

您可以通过

轻松完成此操作
root_url[0..-2] + image.url

我同意它看起来不太好,但完成工作...... :)

答案 8 :(得分:0)

我发现这个技巧可以避免双斜线:

URI.join(root_url, image.url)