2013-03-01 74 views
0

想象一下,一個Rails項目根據它們的名字查找動物名稱。該Rails應用程序由執行實際查找的外部服務提供支持。該服務基於密鑰返回結果。例如,如果我向[GET]/animal?name = benji這樣的外部API請求,我會返回類似{「type」:「dog」,「legs」:「4」,「tail-length 「:」短「」領「:」藍「}。然而,如果我傳入...?name = flipper到動物終點,我會回到{「type」:「dolphin」,「color」:「gray」,「food」:「fish」}。 (數據以實際的JSON或XML格式返回,我只是在這裏用僞代碼來表達這一點)導軌和工廠模式

我的第一個問題是這個......鑑於返回調用的屬性根據在將一個響應(由於缺少一個更好的術語)解組爲一個「模型」對象時,是否傳入,是否有意義地實現某種類型的工廠模式(由Russ Olsen的第13章的Ruby中的ala Design Patterns)來創建對象一個合適的班級?還有其他方法是否合理?

我的下一個問題是這樣的,可以說我想顯示一個網頁上的所有動物列表(使用ERB模板)。是否有意義創建不同的部分模板(例如_dolphin.html.erb和_dog .html.erb),然後在主列表視圖中放置一個案例,該列表視圖可以將每個列表項目渲染爲適當的模板。

例如:

list.html.erb ...

<ul> 
    <% for animal in @animals.each %> 
    <li> 
     <% if animal.type == 'dog' %> 
      <%= render :partial => 'dog', :locals => {:animal => animal} %> 
     <% elsif item.type == 'dolphin' %> 
      <%= render :partial => 'dolphin', :locals => {:animal => animal} %> 
     <% else %> 
      <%= render :partial => 'generic_animal', :locals => {:animal => animal} %> 
     <% end %> 
     </li>   
    <% end %> 
    </ul> 

(這裏animal.type == '狗' 是故意的,我不使用符號(:狗),因爲從API返回的數據是一個字符串值,它用於填充animal.type屬性。Bad,我知道。)

我正在使用的項目現在正在使用此方法。 (顯然,我已經改變了元素/域。)我想知道這是否是一種有效的方法,或者如果其他人已經處理了類似的問題以及他們如何去做。

謝謝!

回答

0

我想說創建一個單一的模型和單個視圖,其中包含所有可能的屬性(不能是無限數字;))。

然後你有一個

if attribute_x exists then 
    display it 
end 

if attribute_y exists then 
    display it 
end 

每個屬性。

如果你爲每隻動物創建一個視圖,這根本就不會幹,因爲你知道每隻動物都有最喜歡的食物和顏色等,所以你會重複自己很多次。另一個原因:如果API改變了一點,並且動物收集或丟失了某個屬性,則必須修改此更改。

只有一種觀點,它會一直很好。

如果要超級確保您收集所有屬性,可以在控制器中放置一個包含所有已知屬性的數組,並且如果有某些未知事件:將其寫入日誌文件。


我只會選擇'每個動物一個視圖'的方式,如果你想能夠顯示一些動物完全不同的東西。但是你也可以告訴你的控制器它應該選擇另一個視圖,如果name = 'Donkey Kong'。你知道我的意思。

+0

謝謝,本傑明。在我的例子中,我正在使用動物。實際的應用程序可能更像是「動物」,而「realestate」是兩個不同的返回對象,並且視圖完全不同。感謝您的反饋! – 2013-03-01 18:07:02