2013-06-26 102 views
0

我有這樣的代碼在我的控制器:軌最好的方式來抽象深對象文本數據

def home 
    @mainImage = [] 
    @mainImage.push(
    {:breakpoint => 1024, 
    :src => i_path('pages/home-d.jpg'), 
    :src_2x => i_path('pages/home-d_2x.jpg')} 
) 
    @mainImage.push(
    {:breakpoint => 768, 
    :src => i_path('pages/home-t.jpg'), 
    :src_2x => i_path('pages/home-t_2x.jpg')} 
) 
    @mainImage.push(
    {:breakpoint => 320, 
    :src => i_path('pages/home-m.jpg'), 
    :src_2x => i_path('pages/home-m_2x.jpg')} 
) 
    @alt = 'An image description' 
    @defaultImage = i_path('pages/home-m.jpg') 
end 

其中在視圖顯示了部分的幫助。

我現在需要添加類似的功能來從回形針對象渲染模型屬性。

這是現在看起來像這樣:

@respImage.push(
    {:breakpoint => 1024, 
    :src => slide.image.url(:desktop_reg), 
    :src_2x => slide.image.url(:desktop_retina)} 
) 
@respImage.push(
    {:breakpoint => 768, 
    :src => slide.image.url(:tablet_reg), 
    :src_2x => slide.image.url(:tablet_retina)} 
) 

#... 

是最終目標有一個幻燈片,有許多幻燈片。 幻燈片有幾個屬性字符串和一個回形針屬性。 回形針屬性對於每個圖像大小都有6種樣式。

Rails如何將上述數據傳輸到視圖中的標準機制是什麼? 我假設這個通用數組不是最靈活的解決方案。


這是代碼結束的地方。

在控制器:

def home 
    @mainImage2 = RespImage.new(:alt => 'default homepage image') 

    @mainImage2.add_breakpoint(BREAKPOINTS['desktop'],i_path('pages/home-d.jpg'),i_path('pages/home-d_2x.jpg')); 
    @mainImage2.add_breakpoint(BREAKPOINTS['tablet'],i_path('pages/home-t.jpg'),i_path('pages/home-t_2x.jpg')); 
    #... 

模型/ resp_image.rb:

class RespImage 
    attr_accessor :alt, :breakpoints 

    def initialize(attributes = {}) 
    attributes.each do |name, value| 
     send("#{name}=", value) 
    end 
    end 

    def add_breakpoint(px,src,src_2x) 
    self.breakpoints ||= []; 
    self.breakpoints.push RespBreakpoint.new(:px => px, :src => src, :src_2x =>src_2x) 
    end 

    def add_paperclip_breakpoints(paperclip) 
    add_breakpoint(BREAKPOINTS('desktop'), paperclip.url(:desktop_reg), paperclip.url(:desktop_retina)); 
    add_breakpoint(BREAKPOINTS('tablet'), paperclip.url(:tablet_reg), paperclip.url(:tablet_retina)); 
    add_breakpoint(BREAKPOINTS('mobile'), paperclip.url(:mobile_reg), paperclip.url(:mobile_retina)); 
    end 

    def default_src 
    self.breakpoints.sort.first.src 
    end 
end 

模型/ resp_breakpoint

class RespBreakpoint 
    include Comparable 

    attr_accessor :px,:src,:src_2x 

    def initialize(attributes = {}) 
    attributes.each do |name, value| 
     send("#{name}=", value) 
    end 
    end 

    def better_than?(other) 
    self.px > other.px 
    end 

    def <=>(other) 
    self.px <=> other.px 
    end 

    def eql?(other) 
    self.px === other.px 
    end 
end 

非常感謝@Dave Newton以下。

回答

1

首先,use value objects。儘管一組哈希似乎很容易,但VOs可以幫助簡化行爲和數據封裝,並提高可讀性。其次,考慮製作這些VO「頂級」模型,以便它們可以使用適當命名的部分進行渲染,我假設它也會清理你的助手。

問題的最後一部分在沒有任何上下文的情況下有點不透明:「添加類似的功能以從Paperclip對象渲染模型屬性」是什麼意思?這些對象是否具有相同的屬性?數據是否已經由類或屬性表示?

如果是後者,那麼你可以使用鴨子打字來消除一些重複。


現在看起來這個信息存儲有點時髦。我可能會將模型轉換一下,並使用一個散列,由斷點(由於它是CSS用來觸發樣式變化的情況很有用)或更多語義(如:desktop,:tablet等)鍵控。

您的模型將包含散列鍵作爲屬性(即,,breakpoint,srcsrc_2x)。

這些值可以存儲在任何地方,這取決於他們需要改變的頻率。使用常量,YAML文件或Ruby配置對象等等可能就足夠了。

數組本身可能由實用程序類或服務對象創建,並使用某些參數來確定需要進入其中的信息。您可能有一種方法需要返回i_path或幻燈片圖像網址,具體取決於傳入的內容(請考慮Inversion of Control)。

或者,它可能是一個裝飾器裝飾了你的幻燈片模式,爲i_path那些假冒(或實際)模型等

+0

我已經添加了更多的細節問題。 – LessQuesar

+0

神聖煙,你幫了很多。非常感謝您的寶貴時間。我對代碼感到非常滿意,我會在上面貼上後代。順便說一下,視圖不需要區分3個斷點,所以我忽略了斷點的散列。像素值本身是輸出環路中唯一需要的差異。我使用響應式圖像JS polyfill是確切的。 – LessQuesar