简体   繁体   中英

How to display images with CarrierWave in Sinatra

I have struggled a lot with CarrierWave, so I made a small program to see if I could make that work:

require 'sinatra'
require 'dm-core'
require 'dm-migrations'
require 'carrierwave/datamapper'

class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
end

DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/photogallery.sqlite3")

class Image
  include DataMapper::Resource

  property :id, Serial
  property :title, Text

  mount_uploader :image, ImageUploader
end

DataMapper.finalize
DataMapper.auto_migrate!

get "/" do
    @images = Image.all
    erb :index
end

post "/" do
    image = Image.new(:title => params[:title])
    image.image = params[:image]
    image.save

    redirect "/"    
end

__END__

@@ index
<% @images.each do |image| %>
    <p>
        <%= image.title %>
    </p>
    <a href="<%= image.image.url %>">
        <img src="<%= image.image.url %>">
    </a>
<% end %>

<form action="/" method="post">
    <label for="title">Title</label>
    <input type="text" name="title"><br>

    <label for="image">Image</label>
    <input type="file" name="image"><br>

    <input type="submit" value="Save">
</form>

It seems that I am unable to display the image when I upload an image from my computer. It is as if the images are not saved anywhere, so they can't be retrieved.

The anchor tag correctly references where the images should be, but there are no images.

What am I doing wrong?

Converted to an answer for @MrMos...

Nevermind, I found out. I did this instead:

require 'sinatra'
require 'dm-core'
require 'dm-migrations'
require 'carrierwave/datamapper'

DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/development.db")

class ImageUploader < CarrierWave::Uploader::Base
    storage :file

    def store_dir
        'images'
    end
end

class Image
    include DataMapper::Resource

    property :id, Serial
    property :title, Text

    mount_uploader :file, ImageUploader
end

DataMapper.finalize
DataMapper.auto_migrate!

get '/' do
    @images = Image.all
    erb :index
end

post '/' do
    Image.create(params[:image])
    redirect to('/')
end

__END__

@@ index
<!DOCTYPE html>
<html>
    <body>
        <form action="/" method="post" enctype="multipart/form-data"></div>
            <input type="text" name="image[title]" />
            <input type="file" name="image[file]" />
            <input type="submit" name="submit" value="Upload" />
        </form>
        <% @images.each do |image| %>
            <p><%= image.title %></p>
            <img src="/images/<%= images.file_identifier %>" />
        <% end %>
    </body>
</html>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM