2011-05-26 75 views
2

我試過這個教程:http://railscasts.com/episodes/253-carrierwave-file-uploads?autoplay=true。 我無法得到這個工作。我的文件沒有上傳,但我可以看到數據已發送到控制器。Rails3 carrierwave無法上傳

class PublicationsController < ApplicationController 
    respond_to :html, :js, :json, :xml 
    def create 
    @publication = Publication.create(params[:publication]) 
    ... 
    end 
end 

UPDATE:

<form novalidate="novalidate" method="post" id="new_publication" enctype="multipart/form-data" class="simple_form publication" action="/sl/publications" accept-charset="UTF-8"><div style="margin:0;padding:0;display:inline"><input type="hidden" value="✓" name="utf8"><input type="hidden" value="vny2UjREsnQLZkUjH3zNxC8Cz5tvG/sAcllyjzZ+PWo=" name="authenticity_token"></div> 
      <div class="inputs"> 
      <div class="input string required"><label for="publication_full_name" class="string required"><abbr title="obvezno">*</abbr> Name</label><input type="text" size="50" required="required" name="publication[full_name]" maxlength="255" id="publication_full_name" class="string required"></div> 
      <div class="input string email required"><label for="publication_email" class="email required"><abbr title="obvezno">*</abbr>Mail</label><input type="email" size="50" required="required" name="publication[email]" maxlength="255" id="publication_email" class="string email required"></div> 
      <div class="input string required"><label for="publication_subject" class="string required"><abbr title="obvezno">*</abbr>Subject</label><input type="text" size="50" required="required" name="publication[subject]" maxlength="255" id="publication_subject" class="string required"></div> 
      <div class="input text required"><label for="publication_text" class="text required"><abbr title="obvezno">*</abbr>Text</label><textarea rows="20" required="required" name="publication[text]" id="publication_text" cols="40" class="text required"></textarea><span class="hint">You can uncomment the line below if you need to overwrite.</span></div> 
      <div class="input file required"><label for="publication_attachment" class="file required"><abbr title="obvezno">*</abbr> Attachment</label><input type="file" required="required" name="publication[attachment]" id="publication_attachment" class="file required"></div> 
      </div> 
      <div class="buttons"> 
      <input type="submit" value="Create Publication" name="commit" id="publication_submit" class="button"> 
      </div> 
     </form> 

我可以看到PARAMS傳遞給控制器​​是這樣的:

Started POST "/en/publications" for 127.0.0.1 at Thu May 26 16:17:25 +0200 2011 
    Processing by PublicationsController#create as HTML 
    Parameters: {"commit"=>"Create Publication", "authenticity_token"=>"vny2UjREsnQLZkUjH3zNxC8Cz5tvG/sAcllyjzZ+PWo=", "utf8"=>"\342\234\223", "publication"=>{"attachment"=>#<ActionDispatch::Http::UploadedFile:0x106d660a8 @headers="Content-Disposition: form-data; name=\"publication[attachment]\"; filename=\"photo.jpg\"\r\nContent-Type: image/jpeg\r\n", @content_type="image/jpeg", @original_filename="photo.jpg", @tempfile=#<File:/var/folders/yX/yXe3dRdgGO8II-+SWIzLRE+++TI/-Tmp-/RackMultipart20110526-35653-1sr4hnw-0>>, "text"=>"asd", "subject"=>"asd", "full_name"=>"asd", "email"=>"[email protected]"}, "locale"=>"en"} 

型號:

class Publication < ActiveRecord::Base 
    mount_uploader :attachment, PublicationUploader 

    validates :subject, 
      :presence => true 
    validates :text, 
      :presence => true 
    validates :full_name, 
      :presence => true 
    validates :email, 
      :presence => true, 
      :email => { :if => 'email.present?' } 
    # validates :attachment, 
    #   :integrity => true, 
    #   :processing => true 
end 

上傳類(默認) :

class PublicationUploader < CarrierWave::Uploader::Base 

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

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

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    # Provide a default URL as a default if there hasn't been a file uploaded: 
    # def default_url 
    # "/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 pdf doc txt) 
    end 

    # Override the filename of the uploaded files: 
    # def filename 
    # "something.jpg" if original_filename 
    # end 

end 

的Gemfile

source 'http://rubygems.org' 

gem 'rails', '3.0.7' 
gem "hirb" 
gem "haml" 
gem "compass" 
gem "asset_tags" 
gem "js_erb" 
gem "jammit" 
gem 'cat_router', '>=0.2.0' 
gem 'devise' 
gem 'i18n_routing' 
gem 'simple_form', '>=1.4' 
gem 'carmen' 
gem 'carrierwave', '>=0.5.4' 

group :development, :test do 
    gem 'sqlite3' 
    gem 'capistrano' 
    gem "win32-open3", :platforms => :mswin 
    gem 'seed-fu' 
end 
group :staging, :production do 
    gem 'mysql' 
end 

幫助?

+1

那麼:multipart =>你的表單中的true? – bor1s 2011-05-26 14:10:11

+0

我有這一切(如在教程中)。 – xpepermint 2011-05-26 14:12:26

+0

你可以在這裏打印從表單傳遞的參數嗎? – bor1s 2011-05-26 14:14:24

回答

2

添加include CarrierWave::RMagick串什麼的軌道控制檯返回下面的代碼:

Publication.create!(:attachment => File.new("test.jpg")) 

確實是創建發佈並保存附件?當然,你必須在rails文件夾中有「test.jpg」文件。

+1

+1。您的其他驗證要求是否得到滿足?添加!如果存在驗證問題,而不是僅僅靜默地回滾,則會產生異常。 – bensie 2011-05-26 15:55:21

0

PublicationUploader模型

+0

哼...爲什麼?我不使用任何這樣的功能(上傳文件如pdf,jpg,不處理) – xpepermint 2011-05-26 14:37:01

+0

好的......我做了,但沒有幫助。 – xpepermint 2011-05-26 14:41:56

+0

嗯...我真的不明白 – bor1s 2011-05-26 14:42:55