我让自己变得非常迷茫。我有一些代码可以拍摄一些图像,将它们组合起来,然后以.png格式喷出合成图像。
最初,此代码是模型的一种方法 - 模型的关联指示要使用的图像。因此:
class Component < Refinery::Core::BaseModel
drawing_accessor :drawing
. . .
end
class Photo < Refinery::Core::BaseModel
has_and_belongs_to_many :components
has_many :drawings, :through=>:components
def diagram
. . . .
Base64.encode64(png.to_blob) #spit out the png as a base64 encoded string
end
end
在视图中我可以写
<img src="data:image/png;base64,<%=@photo.diagram%>"
现在,我需要对图像进行相同的组合,但是直接从组件ID列表中进行。由于组件ID尚未保存到照片中(可能不是),我需要将此代码移出照片模型。
我希望能够使用参数作为组件ID的列表(数组或集合)调用相同的绘图代码,无论它们来自何处。
似乎图表来自一组组件,它应该属于组件......某处。
在我的各种尝试中,我最终使用undefined method
获取ActiveRecord :: Relation或数组。
您能否帮助阐明我对此代码所属位置以及如何调用它的想法?
感谢
答案 0 :(得分:0)
我相信轨道中的指南针宝石只会满足您的需求。 有关罗盘和css sprites,请参阅Rail Casts。
答案 1 :(得分:0)
好吧,发布的力量再次受到打击。
我为组件集合添加了一条新路径:
resources :components do
collection do
get :draw
end
end
在控制器中有匹配的定义
def draw
send_data Component.construct(params[:list],params[:width], params[:height]), :type => 'image/png', :disposition => 'inline'
end
和模型上绘制组件的方法
def self.construct(component_list, width, height)
. . .
Base64.encode64(png.to_blob) #spit out the png as a base64 encoded string
end
Photo模型包含一个方法,它将组件列表汇总在一起,然后调用构造:
def diagram
component_list = []
# construct the list of ids in the right order (bottom to top, or base to capital)
....
Component.construct(component_list, self.image.width, self.image.height)
end
从javascript我可以打电话
var component_list = $("input:checked").map(function(){return this.value}).get();
. . .
$.get(url,{list:component_list, width:width, height:height}, function(data) {
$('img.drawing').attr("src","data:image/png;base64," + data);
})
我仍然怀疑在模型中包含这些方法,而不是在视图或视图助手中包含这些方法,但这确实有效!