如何暂时在Rails中保存图像

时间:2013-07-01 00:03:01

标签: ruby-on-rails ruby ruby-on-rails-3 jquery paperclip

我有一个产品页面,允许用户添加一些文字和照片。产品是模型,照片也是。当然,每张照片都需要一个产品。所以我希望照片在产品提交之前显示缩略图。

我应该......

  1. 找一些方法将这张照片存储在一个会话中(这可能在Rails中吗?)
  2. 或者,制作另一个模型暂时存储此照片并使用AJAX立即加载
  3. P.S。我正在使用gem'paperipip'

    修改: new.html.haml

    = form_for @product,:url => products_path, :html => {:multipart => true } do |f| 
      - if @product.errors.any?
        .error_messages
          %h2 Form is invalid
          %ul
            - for message in @product.errors.full_messages
              %li
                = message
      - if @photo.errors.any?
        .error_messages
          %h2 Image is invalid
          %ul
            - for message in @photo.errors.full_messages
              %li
                = message
      %p
        = f.label :name
        = f.text_field :name
      %p
        = f.label :description
        = f.text_field :description
      %p
        = f.fields_for :photos do  |fp|
          =fp.file_field :image
          %br
    
      %p.button
        = f.submit
    

    产品控制器

      def new 
        @product = Product.new
        @photo = Photo.new
        # 4.times{ @product.photos.build }
        @product.photos.build
      end
    
      def create
      @product = current_user.products.new(params[:product])
      @photo = current_user.photos.new(params[:photo])
    
        if @product.valid?
          @product.save
          @photo.product_id = @product.id
          @photo.save
          render "show", :notice => "Sale created!"
        else
          # 4.times{ @product.photos.build }
          @product.photos.build
          render "new", :notice => "Somehting went wrong!"
        end
    end
    

3 个答案:

答案 0 :(得分:1)

取决于表单行为的方式,简单地使用客户端图像预览而不需要使用ajax(或发送请求)可能更好..

https://github.com/blueimp/JavaScript-Load-Image是一个简单易用的js插件,但它与旧浏览器不兼容

要支持不支持html5的浏览器,您可以使用提供基于闪回的回退的https://github.com/mailru/FileAPI

答案 1 :(得分:0)

根本不要将图像保留在内存中。您可以轻松地从磁盘上读取它,就像您可以通过网络发送它一样快,因此将它放在内存中是没有优势的,除非它是一个被重复命中的缩略图。

除了在Rails的内存中保存它之外,还有其他缓存机制。让Rails使用它的内存来运行它的进程。

答案 2 :(得分:0)

我通过放宽他们拥有产品的约束并添加启用标志来实现这一目标。

  1. 使用AJAX上传图像,然后创建照片模型。 product_id为null,enabled为false。
  2. 显示缩略图。您的表单应包含photo_id,已启用(设置为true)和任何其他相关字段
  3. 提交产品创建表单。照片模型与产品相关联,并使get sets为true
  4. 对于创建案例,启用标志不是很有趣,但是您需要它来进行更新并创建被取消的标志。您可以编写预定作业,删除与产品无关的任何照片。