2013-01-03 20 views
4

我嘗試在我的rails 3.2應用程序中爲某些圖像上傳設置carrierwave_direct,但似乎無法通過使用direct_upload_form_for標記呈現表單。rails carrierwave_direct無法呈現direct_upload_form_for表單

我在加載包含表單的頁面時出現錯誤「undefined method`direct_fog_url for#< PostmarkerImage:0x007fdbe07b39f0>」。

PostmarkerImage是我已經安裝上載像這樣的模式:

class PostmarkerImage < ActiveRecord::Base 
    attr_accessible :image, :image_cache 

    belongs_to :postmarker 

    validates :image, :presence => true 

    mount_uploader :image, PostmarkerImageUploader 
end 

圖像列是一個字符串,我也保證了遷移已運行到創建列。上傳者現在看起來是這樣的:

class PostmarkerImageUploader < CarrierWave::Uploader::Base 
    include CarrierWaveDirect::Uploader 

    # Include RMagick or MiniMagick support: 
    # include CarrierWave::RMagick 
    include CarrierWave::MiniMagick 

    # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility: 
    include Sprockets::Helpers::RailsHelper 
    include Sprockets::Helpers::IsolatedHelper 

    # Choose what kind of storage to use for this uploader: 
    # storage :file 
    # storage :fog 

    include CarrierWave::MimeTypes 
    process :set_content_type 

    # Provide a default URL as a default if there hasn't been a file uploaded: 
    # def default_url 
    # # For Rails 3.1+ asset pipeline compatibility: 
    # # asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) 
    # 
    # "/images/fallback/" + [version_name, "default.png"].compact.join('_') 
    # end 

    # Process files as they are uploaded: 
    # process :scale => [200, 300] 
    # 
    # def scale(width, height) 
    # # do something 
    # end 

    # Create different versions of your uploaded files: 
    # version :thumb do 
    # process :scale => [50, 50] 
    # end 

    # Add a white list of extensions which are allowed to be uploaded. 
    # For images you might use something like this: 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 

    # Override the filename of the uploaded files: 
    # Avoid using model.id or version_name here, see uploader/store.rb for details. 
    # def filename 
    # "something.jpg" if original_filename 
    # end 

end 

我也保證carrierwave_direct,霧,mini_magick和已經安裝的ImageMagick。我可否知道我還錯過了什麼?它幾乎看起來像上傳器的安裝沒有做好。

回答

5

管理弄明白:)萬一有人有這樣的問題:

我實現一個單獨的模型來保存我的圖片,而不是添加一列到現有的表。因此,direct_upload_form_for期望(例如Image.new.image)而不是我正在返回的Object(例如Image.new)。我猜我被form_for拋棄了,通常期望對象

+0

我有這個問題。你能否提供你發現的解決方案的明確例子? –

+0

他的意思是,而不是僅僅爲了Image.new的direct_upload_form_do do | f |'你需要'direct_upload_form_for Image.new.image do | f |'(注意.image)。 – IAmNaN

1

對於遇到此錯誤的其他人,您可能不會將正確的對象傳遞給direct_upload_form_for。假設我們有一個帶有化身列的用戶模型。它應該看起來像。

型號:

class User < ActiveRecord::Base 
    mount_uploader :avatar, AvatarUploader 
end 

控制器:

def edit # Could be any action, but I always direct upload to existing objects 
    @uploader = @user.avatar 
    @uploader.success_action_redirect = edit_registration_url(resource) 
end 

視圖(ERB):

<%= direct_upload_form_for @uploader do |f| %> 
    <%= f.file_field :image %> 
<% end %> 

通知的@uploader對象實際上是如何 @ user.avatar ,而不是對象 @user。這就是OP在他的回答中所談論的。這在他的情況下更令人困惑,因爲對象不是用戶,而是PostmarkerImage,我認爲這是一種只存在用於保存圖像的模型。當您想要一個對象(即Postmarker)具有多個圖像時,這很常見。所以你只爲圖像創建一個模型,並建立它們之間的關係。

陷阱:我也收到此錯誤很多的生產,因爲我忘記執行代碼的控制器從edit動作複製到update行動。如果由於驗證(如文件類型)導致上傳失敗,則需要記住再次設置@uploader!同樣,如果您的上傳器在new中,請記得在create中分配@uploader。