1

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

我是不是该...

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

PS我正在使用宝石'回形针'

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

3 回答 3

1

根据表单行为的不同,最好只使用客户端图像预览而不需要使用 ajax(或发送请求)。

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

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

于 2013-07-01T03:41:43.237 回答
0

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

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

于 2013-07-01T00:13:09.033 回答
0

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

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

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

于 2013-07-01T02:14:39.760 回答