I have a Catalog
that has an attribute called file:
class Catalog < ActiveRecord::Base
mount_uploader :file, CatalogUploader
How would I create a link that would show that file in the browser?
I tried
<%= link_to "zzzz", catalog.file_url %>
but when I click that link it just gives me a routing error
Routing Error
No route matches [GET] "/Users/emai/Documents/mysite/catalogs/2/vegetarian.png"
And the URL doesn't look correct either: http://localhost:3000/Users/emai/Documents/mysite/catalogs/2/vegetarian.png
. I know the pic exists because I made a link to download the file, and that worked properly. However, I want to show the pic instead.
CatalogUploader:
# encoding: utf-8
class CatalogUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
# include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
if Rails.env.test? || Rails.env.cucumber?
"#{Rails.root}/public/test/file_uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
else
"#{Rails.root}/catalogs/#{model.id}"
end
end
# Provide a default URL as a default if there hasn't been a file uploaded:
# def default_url
# # For Rails 3.1+ asset pipeline compatibility:
# # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
#
# "/images/fallback/" + [version_name, "default.png"].compact.join('_')
# end
# Process files as they are uploaded:
# process :scale => [200, 300]
#
# def scale(width, height)
# # do something
# end
# Create different versions of your uploaded files:
# version :thumb do
# process :scale => [50, 50]
# end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
# def extension_white_list
# %w(jpg jpeg gif png)
# end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
# def filename
# "something.jpg" if original_filename
# end
end
Update the store_dir
method in CatalogUploader
as below:
def store_dir
if Rails.env.test? || Rails.env.cucumber?
"#{Rails.root}/public/test/file_uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
else
"#{Rails.root}/public/catalogs/#{model.id}" ## Should be in public folder
end
end
The images must be present in public
folder so that they are accessible from web. If they are not, then Rails would try to locate its route in routes.rb
.
Also, I think you would need to change Catalog
model as below:
class Catalog < ActiveRecord::Base
mount_uploader :file, CatalogUploader, mount_on: :file
As per the docs:
:mount_on => Symbol
if the name of the column to be serialized to differs you can override it using this option
According to the documentation, you should do call the method url
of the file object like this :
<%= link_to "zzzz", catalog.file.url %>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With