Rails 4 - 在数据库中保存图像 [英] Rails 4 - saving images in database

查看:41
本文介绍了Rails 4 - 在数据库中保存图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

亲爱的程序员们,

我正在尝试使用电子书Praxiswissen - Ruby on Rails"开发 Web 应用程序.我的问题是我想通过表单将图像保存到我的项目目录中.数据库只保存有保存时间的图片名称:

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:

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.

控制器:

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 !@post.valid?
        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 !@post.save_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

当我正确填写表单时,我只收到一条消息,提示保存文件出现问题,但它应该返回一条消息,指出我的文件已保存.

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.

在此先非常感谢您!

推荐答案

很幸运,我发现了我的问题.我的 Post 模型中的 save_files 方法没有返回 true..

I'm lucky to tell that I found my issue. My save_files method in my Post model doesn't returned true..

我发布这个答案是因为也许有人可以用这个问题作为他自己问题的答案.这是我添加我的 return 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 :

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

这篇关于Rails 4 - 在数据库中保存图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆