I'm using S3 to serve my public folder & trying to build a simple URL to one of these assets.
My production.rb has:
config.action_controller.asset_host = "https://my-bucket.s3.amazonaws.com"
And this works perfect in my .erb files:
<%= image_tag("rails.png") %>
# => <img src="https://my-bucket.s3.amazonaws.com/rails.png" />
But I need a url (not a tag) for a GENERIC file type, like:
<%= asset_host "foo.bar" %>
# => https://my-bucket.s3.amazonaws.com/foo.bar
What is the magic, two-word, underscore joined, rails phrase that gives me this url?
Use <%= asset_path "foo.bar" %>.
Related
Currently I do this for my website
image_tag("logo.png")
This results
<img src="/assets/logo-c9dc9867ad75fdidmjdoehdo53di.png" alt="Logo" />
This works just fine for me. But sometimes I just need the source part of the image i.e I just need this part /assets/logo-c9dc9867ad75fdidmjdoehdo53di.png. How can I get it?
If your images are in app/assets/images, then use asset_path
<%= asset_path("logo.png") %>
# => "/assets/logo-c9dc9867ad75fdidmjdoehdo53di.png"
If your images are in public/assets, then use image_path
<%= image_path("logo.png") %>
# => "/assets/logo-c9dc9867ad75fdidmjdoehdo53di.png"
I upgraded from Rails 4.1 to 4.2. I get the following error now:
Sprockets::Rails::Helper::AbsoluteAssetPathError at /
Asset names passed to helpers should not include the "/assets/" prefix. Instead of "/assets/spinner.gif", use "spinner.gif"
The error message is clear. However, I don't know what it's talking about. It highlights this line of code:
<div class="loading">
<%= image_tag asset_path('spinner.gif') %>
</div>
I do not use the literal string '/assets/' in that line of code. So what is this error referring to?
I was able to resolve that specific error by removing the call to asset_path and just using image_tag 'spinner.gif'; however, I still get the error right here (I am using Paperclip gem):
<%= image_tag current_user.avatar.url(:thumb) %>
caused by this:
ActionController::Base.helpers.asset_path('missing-user.png')
Again, it is complaining about asset_path.
UPDATE:
Error only occurs when I pass asset_path to image_tag method:
ActionController::Base.helpers.asset_path('missing-user.png')
=> "/assets/missing-user.png"
helper.image_tag(ActionController::Base.helpers.asset_path('missing-user.png'))
Sprockets::Rails::Helper::AbsoluteAssetPathError: Asset names passed to helpers should not include the "/assets/" prefix. Instead of "/assets/missing-user.png", use "missing-user.png"
image_tag will pass the source option to asset_path on its own:
image_tag("icon")
# => <img alt="Icon" src="/assets/icon" />
image_tag("icon.png")
# => <img alt="Icon" src="/assets/icon.png" />
image_tag("/icons/icon.gif", height: '32', width: '32')
# => <img alt="Icon" height="32" src="/icons/icon.gif" width="32" />
So when you call image_tag asset_path('spinner.gif') you're actually doing image_tag( '/assets/spinner.gif' ) which is why you get the sprockets warning.
I resolved the issue but I still don't understand the WHY factor. This only happens when I upgraded from Rails 4.1 to 4.2. Check this out:
ActionController::Base.helpers.asset_path('missing-user.png')
=> "/assets/missing-user.png"
helper.image_tag "/assets/missing-user.png"
Sprockets::Rails::Helper::AbsoluteAssetPathError: Asset names passed to helpers should not include the "/assets/" prefix. Instead of "/assets/missing-user.png", use "missing-user.png"
helper.image_tag "missing-user.png"
=> "<img src=\"/assets/missing-user.png\" alt=\"Missing user\" />"
Based on the above, image_tag does not want you to pass it the literal path string 'assets'. Consequently, in my Paperclip gem helper, I had to od this:
has_attached_file :avatar,
styles: { normal: "128x128>", thumb: "40x40>" },
default_style: :thumb,
default_url: ->(attachment) { 'missing-user.png' }
In other words, I had to remove this:
ActionController::Base.helpers.image_url('missing-user.png')
since image_url returns the string '/assets/missing-user.png'.
I've got a rake task which uploads images I've cached from an API to my S3 bucket. In my view, I try to output the image but it just doesn't appear to work. What I want to do is cache the images onto my filesystem, send them to S3 and I want to use the location of the image from my S3 bucket rather than my filesystem. My code looks like below:
In my rails console, I do this just to check the image url:
1.9.3p125 :002 > a.image
=> http:://s3-eu-west-1.amazonaws.com/ramen-hut/pictures/1.jpg?1343645629
1.9.3p125 :003 >
I use Paperclip in my app, is it supposed to add the url as "http:://"? Seems rather weird. The code in my index.html.erb looks like this:
<li>
<%= movie.title %>
<%= image_tag movie.image.url %>
</li>
But this results in the following html:
<li>
Cowboy Bebop
<img alt="1" src="/assets/http:://s3-eu-west-1.amazonaws.com/ramen-hut/pictures/1.jpg?1343645629">
</li>
Why does it include the '/assets'/ before my URL?
I configured Paperclip to set up the image url for my European S3 Bucket following a tutorial. So in my environment.rb, I've got this:
#Signature correction for Paperclip and AWS
AWS::S3::DEFAULT_HOST = "s3-eu-west-1.amazonaws.com"
And I've got an aws-signature.rb file in my initialisers directory with this code:
#Makes Paperclip use the correct URL for images
Paperclip.interpolates(:s3_eu_url) { |attachment, style|
"#{attachment.s3_protocol}://s3-eu-west-1.amazonaws.com/#{attachment.bucket_name}/#{attachment.path(style).gsub(%r{^/}, "")}"
}
There's a problem with the URL : http::// instead of http:// so image_tag doesn't know it's an absolute URL.
How do you generate these URLs? Gem or your own code?
In my mailer views, I include images as follows:
<%= image_tag "header.png" , :alt => "" %>
Which results in the following HTML in the generated email
<img alt="" src="http://example.com/assets/header-247cf573710c22ec2c14eafefeb4c7c1.png">
However, in the case of images used in emails, I would prefer NOT to include the fingerprinting. If I change the header image slightly, I would prefer that when a user drags up an old email, they see the new image, rather then getting an error because the old, fingerprinted URL is no longer valid.
In Rails 3.1.1 both versions of assets are available, and you can use the :digest => false option to make Rails give you the plain path to the asset
<image alt="" src="<%= asset_path 'header.png', :digest => false %>" />
You can set this digest for the entire project in your development or production environment config file by adding the below:
# Generate digests for assets URLs
config.assets.digest = false
Assets are working fine for my web views, but for some reason my Mailer doesn't use the asset pipeline. I am trying to use an image_tag in my mailer view:
=link_to image_tag("logo.png")
However, that renders as
<img alt="logo" src="http://mydomain.com/assets/logo.png">
instead of
<img alt="logo" src="http://mydomain.com/assets/logo-xxxxxxxxx...png">
Am I missing something here?
My settings are:
config.action_mailer.default_url_options = { :host => config.domain }
config.action_mailer.asset_host = "http://" + config.domain
Thank you!
Try to put in your mail template the following instead of the link_to ( the link_to makes no sense because you link here your image to nothing, and I don't see the a href as output in your html) :
= asset_path("logo.png")
also put in your specific environment file :
config.action_mailer.default :content_type => "text/html"
Like this you are sure that you always use HTML as default content type. If u are using images in the mails it is better to put it as html.