Rails,before_create

时间:2013-06-26 16:58:28

标签: ruby-on-rails ruby-on-rails-3

Im rails beginner我试图为图像网址添加一个载波上传,如railscast中的第253集中所示。到目前为止,当我插入普通链接时,所有工作都很好,例如

http:/.....g/dog-01.jpg

我的问题是我想从一个提供数据的javascript插件中检索我的图像:图像输出,你可以在这里看到:

var url = canvas.toDataURL('image/png');
document.getElementById("canvascontent").value = url;

您还可以看到我将数据:image插入输入(#canvascontent)。

<%= ff.text_field :remote_name_url, class => "canvascontent" %>

所以现在我的问题是,当我尝试简单地保存text_field :remote_name_url中的数据:图像时,这不起作用,因为它是用base64编码的。

好的是Ruby有一个Base64编码器。要编码数据:图像并将其保存在图像文件中(这里是png)我写了一个简单的代码,我可以从我的控制台执行:

require 'base64'

data_url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB....."
png      = Base64.decode64(data_url['data:image/png;base64,'.length .. -1])
File.open('testal', 'wb') { |f| f.write(png) }

所以要走到尽头。我的问题是我不知道如何用rails实现这个目标! 我知道模型有一个“代码”before_create,我尝试过类似的东西,但我没有工作。我想因为我必须先暂时保护图像!

before_create do
require 'base64'
self.remote_name_url = Base64.decode64(remote_name_url['data:image/png;base64,'.length .. -1])
end 

    class Painting < ActiveRecord::Base
    belongs_to :treatment
    attr_accessible :name, :image, :remote_name_url
    mount_uploader :name, BildUploader

    before_create do
require 'base64'
self.remote_name_url =   Base64.decode64(remote_name_url['data:image/png;base64,'.length .. -1])
    end 
    end

&LT;

 class TreatmentsController < ApplicationController
def create
    @patient = Patient.find(params[:patient_id])
    @treatment = @patient.treatments.create(params[:treatment])
    redirect_to patient_path(@patient)
end
def destroy
    @patient = Patient.find(params[:patient_id])
    @treatment = @patient.treatments.find(params[:id])
    @treatment.destroy
    redirect_to patient_path(@patient)  
end

1 个答案:

答案 0 :(得分:0)

来自Carrierwave wiki的这篇文章似乎很有希望:

https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Upload-from-a-string-in-Rails-3

还有使用Rack::Test::UploadedFileStringIO对象的旧技术,但在代码中看起来更奇怪,而不是用于测试环境。