Ruby-on-rails Rails 4 - 在数据库中保存图像
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22247582/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Rails 4 - saving images in database
提问by Lukas Warsitz
Hello dear Programmers,
亲爱的程序员你好,
I'm trying to develop a web application with the ebook "Praxiswissen - Ruby on Rails". My problem is that I want to save Images through a form to my project directory. The database just saves the name of the pictures with the saving time:
我正在尝试使用电子书“Praxiswissen - Ruby on Rails”开发一个 Web 应用程序。我的问题是我想通过表单将图像保存到我的项目目录中。数据库只保存带有保存时间的图片名称:
def unique_and_proper_filename(filename)
Time.now.to_i.to_s + '_' + File.basename(filename)
end
My problem is that my pictures dont get saved after submitting my form. I dont get some exceptions, thats why I dont know where my issue is.
我的问题是提交表单后我的图片没有得到保存。我没有得到一些例外,这就是为什么我不知道我的问题在哪里。
Controller:
控制器:
class PostsController < ApplicationController
require 'will_paginate'
def new
@post = Post.new
end
# information about saving the picture
def create
@post = Post.new(params[:post].permit(:title, :description, :date, :image_file, :thumbnail_file))
# Form isn't correctly filled message
if [email protected]?
flash.now[:notice] = "Bitte füllen Sie alle Felder aus und überprüfen Sie Ihre Angaben."
render(:action => :new)
# Files weren't saved message
elsif [email protected]_files
flash.now[:notice] = "Es trat ein Fehler beim Hochladen der Dateien auf."
render(:action => :new)
# Files saved correctly message
else
@post.save
flash[:notice] = "Dateien wurden hochgeladen und die Daten wurden gespeichert."
redirect_to(:action => :list)
end
end
# list action for listing my pictures
def list
@posts = Post.paginate(:page => params[:page], :order => "date DESC", :per_page => 15)
@post_pages = Post.paginate(:page => params[:page], :order => "date DESC", :per_page => 15)
end
end
HTML Form:
HTML 表单:
<h2>Neues Foto anlegen</h2>
<%= form_tag({:action => :create}, :multipart => true) %>
<h3>Bilddaten</h3>
<p>
Titel<br/>
<%= text_field(:post, :title) %>
</p>
<p>
Beschreibungen<br/>
<%= text_field(:post, :description) %>
</p>
<p>
Datum und Uhrzeit<br/>
<%= datetime_select(:post, :date, :order => [:day, :month, :year, :hour]) %>
</p>
<p>
<h3>Datei-Upload</h3>
<p>
Bilddatei:<br/>
<%= file_field(:post, :image_file) %>
</p>
<p>
Thumbnail:<br/>
<%= file_field(:post, :thumbnail_file) %>
</p>
<%= submit_tag("Speichern") %>
</p>
</form>
Model:
模型:
class Post < ActiveRecord::Base
validates_presence_of(:title, :description, :date, :image, :thumbnail)
I18n.enforce_available_locales = false
def image_file= (fileobj)
if fileobj.size > 0
@image_file = fileobj
self.image = unique_and_proper_filename(fileobj.original_filename)
end
end
def thumbnail_file= (fileobj)
if fileobj.size > 0
@thumbnail_file = fileobj
self.thumbnail = unique_and_proper_filename(fileobj.original_filename)
end
end
def save_files
# Bilddatei save
if !save_uploaded_file(@image_file, IMAGE_DIR, self.image)
return false
end
# Thumbnail save
if !save_uploaded_file(@thumbnail_file, THUMBNAIL_DIR, self.thumbnail)
return false
end
end
private
def unique_and_proper_filename(filename)
Time.now.to_i.to_s + "_" + File.basename(filename)
end
private
def save_uploaded_file(fileobj, filepath, filename)
# Complete Path
complete_path = Rails.root + "/public/" + filepath
# if neccessary, create directory
FileUtils.mkdir_p(complete_path) unless File.exists?(complete_path)
# save data
begin
f = File.open(complete_path + "/" + filename, "wb")
f.write(fileobj.read)
rescue
return false
ensure
f.close unless f.nil?
end
end
end
I'm only getting the message that there went something wrong with saving the files when i fill the form correctly but it should return a message that says that my file were saved.
当我正确填写表单时,我只收到一条消息,提示保存文件出现问题,但它应该返回一条消息,说明我的文件已保存。
I'm sorry for that massive length of my question but I really dont know where my issue is... If there's a need for more information or code, I will add it as fast as I can.
我很抱歉我的问题太长,但我真的不知道我的问题出在哪里......如果需要更多信息或代码,我会尽快添加它。
Thank you very much in advance!
非常感谢您提前!
回答by Richard Peck
I'm sorry but I'll only be able to recommend what we use:
对不起,我只能推荐我们使用的东西:
Paperclip
回形针
I appreciate you're using a tutorial, but I'd highly recommend using the Paperclip gemfor this
感谢您使用教程,但我强烈建议您为此使用Paperclip gem
This handles ALL the heavy lifting for you:
这将为您处理所有繁重的工作:
#GemFile
gem "paperclip", "~> 4.1.1"
Model
模型
#app/models/post.rb
Class Post < ActiveRecord::Base
has_attached_file :image
end
#migration
add_attachment :posts, :image
Controller
控制器
#app/controllers/posts_controller.rb
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
end
private
def post_params
params.require(:post).permit(:image, :other, :params)
end
View
看法
#app/views/posts/new.html.erb
<%= form_for @post do |f| %>
<%= f.file_field :image %>
<% end %>
回答by Lukas Warsitz
I'm lucky to tell that I found my issue. My save_filesmethod in my Postmodel doesn't returned true..
我很幸运地说我发现了我的问题。我save_files在我的方法Post模型不回来true..
I post this answer because maybe someone could use this question as an answer for his own problem. Here's where I added my return true:
我发布这个答案是因为也许有人可以用这个问题作为他自己问题的答案。这是我添加的地方return true:
def save_files
# Bilddatei save
if !save_uploaded_file(@image_file, IMAGE_DIR, self.image)
return false
end
# Thumbnail save
if !save_uploaded_file(@thumbnail_file, THUMBNAIL_DIR, self.thumbnail)
return false
end
return true # <--------- Need to be added!
end
回答by Suman saurabh
Try to add enctype= multipart/formdata in your form tag if you are using form to post your data
如果您使用表单发布数据,请尝试在表单标签中添加 enctype= multipart/formdata

