加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails 4 – 在数据库中保存图像

发布时间:2020-12-17 01:52:49 所属栏目:百科 来源:网络整理
导读:亲爱的程序员你好, 我正在尝试使用电子书“Praxiswissen – Ruby on Rails”开发一个Web应用程序.我的问题是我想通过表单将图像保存到我的项目目录中.数据库只保存图片的名称,节省时间: def unique_and_proper_filename(filename) Time.now.to_i.to_s + '_'
亲爱的程序员你好,

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

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 !@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],: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,: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,: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

当我正确填写表单时,我只收到保存文件出错的消息,但它应该返回一条消息,说明我的文件已保存.

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

非常感谢你提前!

解决方法

对不起,我只能推荐我们用的东西:

回形针

我感谢您使用的是教程,但我强烈建议您使用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 %>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读