簡體   English   中英

是Rails3,S3,回形針附件嗎?

[英]Rails3, S3, Paperclip Attachment as it's own model?

因此,我正在開發一個應用程序,用戶可以在該應用程序上上傳和管理帶有特定於行業的元數據的照片。

Photo模型具有所有這些元數據,並且我正在使用Paperclip將實際圖像文件附加到模型並將圖像存儲在Amazon S3上。

用戶交互當前的工作方式如下:

  1. 用戶單擊“添加照片”,然后轉到“新照片”頁面,在該頁面中向他顯示​​一個表單。
  2. 表單上的第一件事是文件選擇器。 用戶選擇一個文件。
  3. 在此之下是供用戶填寫的元數據的幾個不同字段,因此用戶可以填寫這些字段。
  4. 用戶點擊提交,上傳文件並創建一個新的Photo對象,將用戶重定向到另一個頁面。

因此,我想做的一個明顯改進是,照片實際上是在此過程開始時上傳的,因此在單擊“提交”和將其重定向到下一頁之間沒有明顯的延遲。 能夠在完成上傳后向用戶顯示其照片的縮略圖預覽,這也很好,以便他們在填寫表單時可以看到正在放入元數據的照片。

我認為,如果我將圖像文件分割成自己的模型,就可以實現這一點,但是我會像這樣引用圖像:

@photo.attachment.file.url而不是我現在使用的更簡單的@photo.file.url 我寧願不要“深陷”它。

另外,將其分為兩個模型也帶來了管理孤兒的問題,這是我目前無需處理的問題。

所以我的問題是:

  1. 有沒有一種好方法-最好使用Flash-創建這種異步上傳行為而不拆分為兩個模型,或者-
  2. 如果必須將元數據和文件分成兩個模型,是否有辦法讓Paperclip將附件視為自己的模型,以便我可以使用<modelname>.<paperclip_method>而不是<model_name>.<attachment_attribute>.<paperclip_method>

我知道這是一個大問題,所以在此先非常感謝您的幫助!

我建議您將new動作替換為edit動作(用戶選擇動作時可以自動創建照片模型。這樣,您可以通過Flash使用AJAX文件上傳(某些新型瀏覽器支持)備用,以進行上傳,還可以編輯元數據。要進行上傳,請嘗試查看pluploaduploadify

像這樣簡單地定義Photo#url有什么問題?

class Photo
  def url(*args)
    attachment.url(*args)
  end
end

沒必要在這里花哨。

經過一周的實驗,我以為我會發布最終的內容:

實際上,我確實將照片分成了兩個模型,因為最終我不得不使用任何嘗試的方法來創建空記錄。 我發現最終擁有兩個單獨的模型更加容易,因為:

  1. 它使在Rails約定中的工作變得更加容易(使用第二個模型的標准REST操作來處理異步更新,而不必向父模型添加幾個自定義操作)。

  2. 無論我嘗試哪種選擇,我最終都可能會有孤立記錄。 我發現擁有一個永遠不會保存的父對象(除非是有效的)(在我的情況下為Photo模型),並帶有可能是孤兒的附件,這比較容易。 從未在應用程序中的任何位置直接調用附件,因此不存在意外拉出空白記錄的風險,也無需設置默認范圍或僅顯示“有效”照片的內容。 清理孤兒非常容易,只需執行Attachment.where( :parent_id => nil )並刪除所有這些。

  3. 我可以通過簡單地將附件委派給照片來維護先前的代碼。 請參閱另一個問題的答案

我希望這可以避免其他麻煩。 如果您需要帶有附件的Ajax功能,最好使它們成為自己的模型。 另外,要向表單添加ajax文件上傳,請查看https://github.com/formasfunction/remotipart 這保存了我的應用程序。

只是想知道,您是否未在關聯中設置從屬子句? 例如,

Class Photo < ActiveRecord::Base
  :has_one :attachment, :dependent => :destroy
end

這將防止孤立記錄,因為只要在Photo上調用destroy方法,它將首先執行Photo.attachment.destroy。 它也可以和:has_many一起使用。

基本上,您將Photo對象的創建分為兩個部分:上傳照片和添加元數據。 在非AJAX網站中,這將是兩個單獨頁面上的兩個單獨步驟。

我要做的是允許AJAX上傳實例化一個Photo對象,並將其保存(與上傳的照片一起使用)。 然后,我將讓AJAX代碼將令牌返回到與會話變量相對應的站點,以使表單知道已創建照片的記錄。 當用戶提交表單的其余部分時,如果存在令牌,它將知道將數據填充到已經創建的照片對象上。 如果令牌不存在,它將知道需要從頭開始創建Photo對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM