Rails - 找到通用代码的正确位置

时间:2012-08-01 03:05:54

标签: ruby-on-rails code-organization view-helpers

我让自己变得非常迷茫。我有一些代码可以拍摄一些图像,将它们组合起来,然后以.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或数组。

您能否帮助阐明我对此代码所属位置以及如何调用它的想法?

感谢

2 个答案:

答案 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);
})

我仍然怀疑在模型中包含这些方法,而不是在视图或视图助手中包含这些方法,但这确实有效!