2013-06-20 44 views
4

我试图让CKEditor与Carrierwave和Cloudinary一起工作。到目前为止,具有常规文件上传字段的非CKEditor启用的视图与Carrierwave & Cloudinary完美配合。然而,当我试图上传CKEditor中的文件并将其发送到服务器时,我得到一个NoMethodError - undefined method 'each' for "image/jpeg":String:CKEditor Carrierwave Cloudinary

在从CKEditor类删除本地存储配置之前,它正在工作,但是在本地保存文件。

这里是我当前的CKEditor上传:

class CkeditorAttachmentFileUploader < CarrierWave::Uploader::Base 
    include Cloudinary::CarrierWave 
    include Ckeditor::Backend::CarrierWave 

    def extension_white_list 
    Ckeditor.attachment_file_types 
    end 
end 

日志文件:

Started POST "/ckeditor/pictures?CKEditor=subsection_content&CKEditorFuncNum=3&langCode=en&authenticity_token=5Bt06UwjUD%2FEdLFANBmZojdv8Hvn2GbQRLvC6h11Dd8%3D" for 127.0.0.1 at 2013-06-20 15:44:18 -0700 
Processing by Ckeditor::PicturesController#create as HTML 
    Parameters: {"upload"=>#<ActionDispatch::Http::UploadedFile:0x007ff742c77018 @original_filename="pic1.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"upload\"; filename=\"pic1.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<Tempfile:/var/folders/0t/l1qc3j596v77_z3s8f2pm75w0000gn/T/RackMultipart20130620-18566-i0av53>>, "CKEditor"=>"subsection_content", "CKEditorFuncNum"=>"3", "langCode"=>"en", "authenticity_token"=>"5Bt06UwjUD/EdLFANBmZojdv8Hvn2GbQRLvC6h11Dd8="} 
    (0.4ms) BEGIN 
    (0.4ms) ROLLBACK 
Completed 500 Internal Server Error in 4ms 

NoMethodError - undefined method `each' for "image/jpeg":String: 
    (gem) cloudinary-1.0.59/lib/cloudinary/carrier_wave/process.rb:100:in `block in transformation' 

赞赏任何想法!

更新 - 从塔尔列弗 - 阿米回答工作配置

这是我当前的工作ckeditor_picture_uploader.rb文件:

# encoding: utf-8 
class CkeditorPictureUploader < CarrierWave::Uploader::Base 
    include Ckeditor::Backend::CarrierWave 
    include Cloudinary::CarrierWave 

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

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

    # 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/ckeditor/pictures/#{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 

    [:extract_content_type, :set_size, :read_dimensions].each do |method| 
    define_method :"#{method}_with_cloudinary" do 
     send(:"#{method}_without_cloudinary") if self.file.is_a?(CarrierWave::SanitizedFile) 
     {} 
    end 
    alias_method_chain method, :cloudinary 
    end 

    process :read_dimensions 

    # Create different versions of your uploaded files: 
    version :thumb do 
    process :resize_to_fill => [118, 100] 
    end 

    version :content do 
    process :resize_to_limit => [800, 800] 
    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 
    Ckeditor.image_file_types 
    end 
end 

回答

5

尝试将下面的代码添加到您的CkPictureUploader/CkeditorAttachmentFileUploader:

[:extract_content_type, :extract_size, :extract_dimensions].each do |method| 
    define_method :"#{method}_with_cloudinary" do 
    send(:"#{method}_without_cloudinary") if self.file.is_a?(CarrierWave::SanitizedFile) 
    {} 
    end 
    alias_method_chain method, :cloudinary 
end 
4

Ckeditor已更新,因此可能需要extract_size和extract_dime根据CKEditor的宝石版本nsions

提交即转变: https://github.com/galetahub/ckeditor/blob/4e6d8413cc71f40d2d58ab3d0cb8dad19dd96894/lib/ckeditor/backend/carrierwave.rb

即:

[:extract_content_type, :extract_size, :extract_dimensions].each do |method| 
    define_method :"#{method}_with_cloudinary" do 
    send(:"#{method}_without_cloudinary") if self.file.is_a? (CarrierWave::SanitizedFile) 
    {} 
end 
    alias_method_chain method, :cloudinary 
end 
0

结帐我的意见在这里

https://github.com/galetahub/ckeditor/issues/670#issuecomment-301218366

# encoding: utf-8 
class CkeditorPictureUploader < CarrierWave::Uploader::Base 
    include Ckeditor::Backend::CarrierWave 
    include CarrierWave::MiniMagick 
    include Cloudinary::CarrierWave 

    process :extract_dimensions 

    [:extract_content_type, :extract_size, :extract_dimensions].each do |method| 
    define_method :"#{method}_with_cloudinary" do 
     send :"#{method}_without_cloudinary" if self.file.is_a? CarrierWave::SanitizedFile 
     {} 
    end 
    alias_method_chain method, :cloudinary 
    end 

    version :thumb do 
    process :resize_to_fill => [118, 100] 
    end 

    version :content do 
    process :resize_to_limit => [800, 800] 
    end 

    def extension_white_list 
    Ckeditor.image_file_types 
    end 
end