Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails + Carrierwave: How to link to file?

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
like image 457
bigpotato Avatar asked Jan 11 '23 16:01

bigpotato


2 Answers

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

like image 137
Kirti Thorat Avatar answered Jan 21 '23 22:01

Kirti Thorat


According to the documentation, you should do call the method url of the file object like this :

<%= link_to "zzzz", catalog.file.url %>
like image 31
Dougui Avatar answered Jan 21 '23 22:01

Dougui