2014-03-07 48 views
2

你好,亲爱的程序员保存图像,导轨4 - 数据库

我试图发展与电子书的Web应用程序 “Praxiswissen - Ruby on Rails的”。我的问题是我想通过表单将图像保存到我的项目目录中。该数据库只是保存与节省时间的图像的名字:

def unique_and_proper_filename(filename) 
    Time.now.to_i.to_s + '_' + File.basename(filename) 
end 

我的问题是,我的照片不得到保存我提交表单后。我没有得到一些例外,这就是为什么我不知道我的问题在哪里。

控制器:

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&uuml;llen Sie alle Felder aus und &uuml;berpr&uuml;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表单:

<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> 

型号:

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 

我只获得了有去一些错误保存文件的消息时,我正确填写表格,但它应该返回一条消息,说我的文件已保存。

我很抱歉,我的问题很长,但我真的不知道我的问题在哪里......如果需要更多信息或代码,我会尽快添加它。

非常感谢您提前!

+0

你的日志文件(或服务器输出)会告诉你表单中的参数,以及出错的地方和发生的地方。诊断这样的问题时,始终是您首先着手的地方。 –

回答

3

我很幸运地告诉我,我发现我的问题。我在我的Post模型save_files方法不返回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 
16

我很抱歉,但我只能就能够推荐一下我们使用:


回形针

我很欣赏你正在使用的教程,但我强烈推荐使用Paperclip gem

该处理所有繁重的你:

#GemFile 
gem "paperclip", "~> 4.1.1" 

型号

#app/models/post.rb 
Class Post < ActiveRecord::Base 
    has_attached_file :image 
end 

#migration 
add_attachment :posts, :image 

控制器

#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 

查看

#app/views/posts/new.html.erb 
<%= form_for @post do |f| %> 
    <%= f.file_field :image %> 
<% end %> 
+8

回形针是伟大的,我也建议它作为一个正确的应用程序时,要走的路,但是当学习有很多要说的知道如何做自己的事情,而不是把它交给一个神奇的宝石要做到这一点。我其实认为“魔术”是Rails对学习如何使用它的最大问题。 –

+1

是的,我正在使用教程..感谢您的建议!当然我upvote你的答案,但我宁愿按照我的教程,并找到我现有的代码中的问题。如果没有更多的答案能够帮助我使用我的代码,我会接受你的答案并尝试一下“回形针”。谢谢! –

+2

当然 - 我只是想突出你的选择:) –

0

如果您要存储到数据库中,您可能需要将图像保存为二进制格式。

require 'base64' 
base64_encoded = Base64.encode64(img_from_file_form) 

不知怎么找回它来显示图像。

File.open('image_file.gif', 'wb') do|f| 
    f.write(Base64.decode64(base_64_encoded_data)) 
end 
+0

因为我使用的教程,它应该以这种方式正常工作......我认为有一个问题,我的Rails 4.1和教程Rails 2 .. –

0

尝试在你的表单添加标签的enctype =多/ FORMDATA如果您使用的形式来发表您的数据

+1

添加一些解释与答案如何这个答案帮助OP在解决当前问题 –