1

ユーザーがテキストと写真を追加できる製品ページがあります。製品はモデルであり、写真もそうです。当然、各写真には製品が必要です。そのため、製品を送信する前に写真にサムネイルを表示したいと考えています。

するべきか...

  1. この写真をセッションに保存する方法を見つけてください (これは Rails で可能ですか?)
  2. または、別のモデルを作成してこの写真を一時的に保存し、AJAX で即座に読み込みます

PS私はgem 'paperclip'を使用しています

編集: 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を使用できます。

于 2013-07-01T03:41:43.237 に答える
0

イメージをまったくメモリに保持しないでください。ネットワークを介して送信できるのと同じくらい速くディスクから簡単に読み取ることができるため、繰り返しヒットするサムネイルでない限り、メモリに保持しても利点はありません。

Rails のメモリに保持する以外にも、他のキャッシュ メカニズムがあります。Rails がメモリを使用してプロセスを実行できるようにします。

于 2013-07-01T00:13:09.033 に答える
0

製品を持っているという制約を緩和し、有効なフラグを追加することでこれを達成しました。

  1. AJAX を使用して画像をアップロードし、写真モデルを作成します。product_id は null、有効化は false です。
  2. サムネイルを表示します。フォームには、photo_id、有効 (true に設定)、およびその他の関連フィールドを含める必要があります。
  3. 製品作成フォームを送信します。写真モデルが製品に関連付けられ、有効な get セットが true に設定されます

有効化フラグは、作成の場合にはあまり興味深いものではありませんが、キャンセルされた更新と作成には必要です。製品に関連付けられていない写真を削除するスケジュールされたジョブを作成できます。

于 2013-07-01T02:14:39.760 に答える