【问题标题】:How to hold an image temporarily in Rails如何在 Rails 中临时保存图像
【发布时间】:2013-06-28 01:44:30
【问题描述】:

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

我应该……

  1. 想办法在会话中存储这张照片(这在 Rails 中可行吗?)
  2. 或者,制作另一个模型来临时存储这张照片并使用 AJAX 立即加载它

附:我正在使用 gem '回形针'

编辑: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

【问题讨论】:

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


    【解决方案1】:

    根据表单的行为方式,最好直接使用客户端图像预览而不需要使用 ajax(或发送请求)..

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

    要支持不支持 html5 的浏览器,您可以使用 https://github.com/mailru/FileAPI,它提供基于 Flash 的后备功能

    【讨论】:

    • 嘿,罗伊,你总是有这么好的答案!我下载了javascript插件,但它不起作用。然后我在自己的应用程序中设置它,我也无法让它工作:/
    • 你用的是哪个插件? loadimage 应该易于使用,只需按照自述文件中的示例进行操作即可。
    【解决方案2】:

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

    1. 使用 AJAX 上传图片,并创建照片模型。 product_id 为 null,enabled 为 false。
    2. 显示缩略图。您的表单应包含 photo_id、已启用(设置为 true)和任何其他相关字段
    3. 提交产品创建表单。照片模型与产品相关联并启用 get 设置为 true

    启用标志对于创建案例不是很有趣,但您会希望它用于更新和取消的创建。您可以编写一个计划作业来删除与产品无关的所有照片。

    【讨论】:

    • 好的!很好,但是你能给我一些关于我应该在新产品页面和产品控制器上做什么的指示吗? (我在编辑中添加了它们)
    • 我会做一个新的控制器,只是为了照片。它可以有一个单独的操作,创建,当您创建新照片时获取 AJAX 帖子。
    【解决方案3】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 2013-10-13
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多