Fancybox没有使用CarrierWave显示上传的图片

时间:2014-05-17 11:43:16

标签: ruby-on-rails ajax ruby-on-rails-3.2 fancybox carrierwave

我正在尝试使用fancybox来显示图像。当我使用静态图像时,如资产文件夹中的现有,一切正常。但是,当我尝试使用使用carrierwave保存的上传图像时,它总是会显示下一条消息:"无法加载请求的内容。"。

我用来显示图片的代码是下一个:

应用/模型/ upload.rb

class Upload
  include Mongoid::Document
  include Mongoid::Timestamps

  mount_uploader :file, UploadUploader

  # Fields
  field :file, type: String
  field :filename, type: String
  field :file64, type: String
  field :size_file, type: Integer
  field :file_extension, type: String

  # Validations
  validates_presence_of :file

  # Hooks
  before_validation do
    if not self.file.url and self.filename and self.file64
      sio = CarrierwaveStringIO.new( Base64.decode64( self.file64 ) )
      sio.original_filename = self.filename
      self.file = sio
      self.filename = nil
      self.file64 = nil
    end
  end

  before_save do
    self.size_file = self.size
    self.file_extension = File.extname( self.file.to_s )[1..-1]
  end

  def base64
    MIME::Types.type_of( self.file.url ).first.content_type
  end

  def size
    self.file.size
  end
end

应用/视图...

...
= link_to upload_path( upload.id ), class: 'fancybox' do
  = image_tag upload_path( upload.id ), height: 174, width: 256
...

应用/资产/ JavaScript的...

...
$( ".fancybox" ).fancybox()
...

我已经尝试了很多东西来使代码工作。例如,在视图中,我更改了" href" link_tag和" src"的image_tag,到上传的显示路径,但它仍然无法正常工作。此外,我尝试使用AJAX加载图片并使用"内容" fancybox的属性,但我得到了相同的结果。最后,我为上传控制器创建了一个show动作,我只在其中显示图片并使用" content"和"键入" fancybox的属性使用html,但我看不到图片(没有路由与图片的url匹配,而不是show动作)。

我花了很多时间试图让它有效,但我找不到任何东西。提前谢谢。

修改

应用/控制器/ upload_controller.rb

class UploadsController < ApplicationController
  load_and_authorize_resource

  respond_to :html, :json

  def show
    if request.format.html?
      content_type = MIME::Types.type_for( @upload.file.url ).first.content_type
      send_file @upload.file.url, content_type: content_type, disposition: 'inline', :x_sendfile => true
    else
      respond_with @upload, api_template: :general
    end
  end

  ...

应用/上传/上传_...

class UploadUploader < CarrierWave::Uploader::Base
  storage :file

  def store_dir
    "#{ Rails.root.to_s }/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def cache_dir
    "#{ Rails.root.to_s }/tmp/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"

  def extension_white_list
    %w(jpg jpeg png bmp tif)
  end
end

应用/视图/上传/ show.html.haml

= image_tag @upload.file_url.to_s

1 个答案:

答案 0 :(得分:1)

指定类型选项,强制内容类型。它可以设置为'image','ajax','iframe','swf'或'inline'

$( ".fancybox11" ).fancybox({
type: 'iframe', width: 380, height: 280
})

请参阅此链接fancybox api options