RoR tinymce-rails-imageupload获取URL

时间:2012-04-02 21:50:12

标签: ruby-on-rails

我有初学者水平。我无法获得图像网址(我不知道如何)。 https://github.com/Atlantia/tinymce-rails-imageupload

1.Controller

class TinymceAssetsController < ApplicationController  
  def create
    DataFile.save(params[:file])

    render json: {
    image: {
      url: view_context.image_url(image)
    }
 end
}

2.型号

class DataFile < ActiveRecord::Base
  def self.save(file)
    name = file.original_filename
    #create the file path
    path = File.join(directory, name)
    #write the file
    File.open(path, "wb") { |f| f.write(file.read) }
  end
end

文件已保存,但我不知道如何获取网址... 谢谢你的帮助。

我决定使用Paperclip。但是有一个问题。

class DataFile < ActiveRecord::Base
  has_attached_file :file, styles: { medium: "300x300>", thumb: "100x100>" }
end

class TinymceAssetsController < ApplicationController
  def create
    @datafile.update_attributes(file: params[:file])

  render json: {
    image: {
      url: @datafile.file.url(:medium)
    }
  }
  end
end

NoMethodError(nil的未定义方法`update_attributes':NilClass)

和另一个问题: 如果我没有指出风格,图片会有原始尺寸吗?

3 个答案:

答案 0 :(得分:1)

这是使用蜻蜓的解决方案..宝石'蜻蜓','0.9.12' https://github.com/markevans/dragonfly/

1.controller

class TinymceAssetsController < ApplicationController

  def create
    @image = StaticImage.new(:page_image => params[:file])
    @image.save    
    render json: {
      image: {
        url: @image.page_image.url
      }
    }, content_type: "text/html"
  end
end

2。模型

class StaticImage < ActiveRecord::Base
  image_accessor :page_image
  attr_accessible :page_image
end

答案 1 :(得分:0)

查看您链接的gem的来源,它似乎不会为您处理文件保存/处理,只是在TinyMCE中链接它。

我建议将宝石与Paperclip(https://github.com/thoughtbot/paperclip

结合使用
class Datafile < ActiveRecord::Base
  has_attached_file :file, :styles => { :medium => "300x300>", :thumb => "100x100>" }
end

然后你可以将update_attributes中的文件对象传递给它:

@datafile.update_attributes(:file => params[:file])

并使用

在视图中调用它
@datafile.file.url(:medium)

如果您想继续自己处理它,它会被保存到目录中的文件系统/来自用户的原始文件名...这可能会让您对注入攻击和错误的文件名开放!如果你自己生成它,你可以使用Dir类来查看文件系统中的正确文件名吗?

修改

好的,鉴于对问题的修改,这是你的控制器代码应该是什么样子:

class TinymceAssetsController < ApplicationController
  def create
    @datafile = DataFile.create(file: params[:file])


      render json: {
        image: {
          url: @datafile.file.url(:medium)
        }
      }
  end
end

在您的示例中,您没有实例化@datafile对象,因此它是零。您需要从数据库中提取DataFile,或者将其实例化。基本上,Paperclip抽象文件处理,因此它就像一个常规属性。您仍然需要在数据库等中创建它是属性的对象!

答案 2 :(得分:0)

我是通过以下方式做到的:

控制器:

# For uploading images frm TinyMCE

class TinymceAssetsController < ApplicationController
  def create
    # Take upload from params[:file] and store it somehow...
    # Optionally also accept params[:hint] and consume if needed

    image=Image.save(params[:file])
    render json: {
      image: {
        url: view_context.image_url(image)
      }
    }, content_type: "text/html"
  end
end

保存图像的模型

class Image

  def self.save(file)
    name = file.original_filename
    #create the file path
    write_path = File.join(Rails.root,'public','images','upload', name)
    return_path = File.join('upload', name)
    #write the file
    File.open(write_path, "wb") { |f| f.write(file.read) }
    return_path
  end

end

将文件保存到public / images / upload并通过Tinymce正确插入正确的URL。